杨辉三角大家都熟悉,二项式n次方展开式的系数可排列成一个三角形的数表,成为杨辉三角。形似:
1
1 1
1 2 1
1 3 3 1
import java.util.*;
public class Yanghui{
public static void main(String args[]){
Scanner scan = new Scanner(System.in);
int n = Integer.parseInt(scan.next());
int mat[][] = new int[n][];
//
int i,j = 0;
for(i=0;i<n;i++){
mat[i] = new int[i+1];
mat[i][0] = 1;
mat[i][i] = 1;
for(j = 1;j < i; j++){
mat[i][j] = mat[i-1][j-1]+mat[i-1][j];
}
}
for(i = 0;i < mat.length;i++){
for(j = 0; j<n-i;j++){
System.out.print(" ");
}
for(j = 0;j<mat[i].length;j++){
System.out.print(mat[i][j]+" ");
}
System.out.println();
}
}
}
1
1 1 1
1 2 3 2 1
1 3 6 7 6 3 1
以上三角形的数阵,第一行只有一个数1, 以下每行的每个数,是恰好是它上面的数,左上的数和右上数等3个数之和(如果不存在某个数,认为该数就是0)。
求第n行第一个偶数出现的位置。如果没有偶数,则输出-1。例如输入3,则输出2,输入4则输出3。
输入n(n <= 1000000000)
开始的思路就是:将所有的数字都保存到二维数组中,然后在数组的最后一行开始寻找第一个偶数。
代码如下:
public class Test
{
public static int run(int n)
{
int result = -1;
int mat[][] = new int[n][];
int i, j, k =0;
for(i = 0;i < n;i++ ){
mat[i] = new int[2*(i+1)-1];
mat[i][0] = 1;
for(j = 1; j< 2*(i+1)-1;j++){
//left part
if(j<=i){
if(j-2<0){//针对第二列,第二列的元素没有左上角
if(j < mat[i-1].length){
mat[i][j] = mat[i-1][j]+mat[i-1][j-1];
}else{//针对第二行 1 1 1
mat[i][j] = mat[i-1][j-1];
}
}else{
mat[i][j] = mat[i-1][j]+mat[i-1][j-1]+mat[i-1][j-2];
}
k = j;
}else{
//right part
mat[i][j] = mat[i][--k];
}
}
}
//search
for(j = 0; j < mat[n-1].length;j++){
if(mat[n-1][j]%2 == 0){
result = j+1;
break;
}
}
return result;
}
public static void main(String []args)
{
System.out.println(run(1));
}
}
无奈修改了半天,还是超时,突然看到题目上有一个上线【1000000000】,才明白过来这样把每个数字都求出来必然会超时。
最后想了半天还是没想起来好办法。只好求助与强大的百度了。看到网友的答案之后才发下原来如此的简单。
唉。思维一点都不活跃。只怪自己脑子没有转过来圈啊!!!谨记谨记!
http://blog.csdn.net/SunnyYoona/article/details/16917447
http://blog.csdn.net/ToYueXinShangWan/article/details/15021313
http://blog.csdn.net/xhu_eternalcc/article/details/14390617
http://blog.csdn.net/jenly121/article/details/14521287
原文:http://blog.csdn.net/crazy1235/article/details/19783731