杨辉三角
杨辉三角也叫帕斯卡三角,在很多数量关系中可以看到,十分重要。
第0行: 1
第1行: 1 1
第2行: 1 2 1
第3行: 1 3 3 1
第4行: 1 4 6 4 1
....
两边的元素都是1, 中间的元素是左上角的元素与右上角的元素和。
我们约定,行号,列号都从0计数。
所以: 第6行的第2个元素是15,第3个元素是20
直观地看,需要开辟一个二维数组,其实一维数组也可以胜任。
如下程序就是用一维数组“腾挪”的解法。
一位数组解法:
public class Main {
static long f(int row, int col){
if(row<2) return 1;//如果是0.1行则所有数据都为1,返回1
if(col==0) return 1;//如果是每行的第一个,则返回1
if(col==row) return 1;//如果是每行的最后一个,则返回1
long[] a = new long[row+1];//创建一个给定行的个数 列数组用来变换数据
a[0]=1;//第二行开始, 0列初始值为1
a[1]=1;//1列初始值为1
int p = 2;//变量代表循环执行的行数标记
while(p<=row){//循环更新数据到所求的行数
a[p] = 1;//循环每次进来,先修改每行最后一个数据为1
for(int q=p-1;q>0;q--) a[q] = a[q] + a[q-1];//更新数据从前一行的数据更新本行数据,并变换数组中的值,
//采用从后往前更新数据,防止数据覆盖丢失
p++;//增加行数
}
return a[col];//数组最后代表的就是所求行数据,下标即为本行下标,返回结果到主方法
}
public static void main(String[] args){
System.out.println(f(6,2));//调用静态方法f打印返回结果
System.out.println(f(6,3));//调用静态方法f打印返回结果
}
}
二维数组解法:
public class Main {
public static int f(int a,int b){
int[][]arr = new int[a+1][];//声明二维数组的长度
for (int i = 0; i < arr.length; i++) {
arr[i]=new int[i+1];//赋值指定一维数组的长度
if(arr[i].length<=2){//如果是0.1行
for (int j = 0; j < arr[i].length; j++) {
arr[i][j]=1;//全部赋值为1
}
}else{
arr[i][0]=1;//0下标赋值为1
arr[i][arr[i].length-1]=1;//最后一位赋值为1
for (int j = 1; j < arr[i].length-1; j++) {
arr[i][j]=arr[i-1][j]+arr[i-1][j-1];//中间数据赋值
}
}
}
return arr[a][b];//返回数据
}
public static void main(String[] args){
System.out.println(f(6,2));//调用方法传参数获取返回结果
System.out.println(f(6,3));
}
}
输出为:
15
20