题目描述:
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
题目分析:
题干只是说了杨辉三角的一个基本概念。其实,杨辉三角,是二项式系数在三角形中的一种几何排列,它有以下性质需要注意:
1,每行数字左右对称,由 11 开始逐渐变大再变小,并最终回到 1,也即是说每行的第一个数和最后一个书为1------根据此条件可以写出每行首末元素
2,每个数字等于上一行的左右两个数字之和,可用此性质写出整个杨辉三角----------根据此条件可以写出每行的非首末元素。
代码:
先写一个之前学习java基础–二维数组时写的杨辉三角代码:
public class YanghuiTest{
public static void main(String[] args){
//1,声明并初始化二维数组
int[][] yanghui = new int[][];
//2,给数组的元素赋值
for(int i = 0;i < yanghui.length;i++){
yanghui[i] = new int[i+1];
//2.1给首末元素赋值
yanghui[i][] = 1;
yanghui[i][i] = 1;
//2.2给每行的非首末元素赋值
if(i > 1){
for(int j = 1;j < yanghui[i].length - 1;j++){
yanghui[i][j] = yanghui[i - 1][j - 1] + yanghui[i - 1][j];
}
}
}
//3,遍历二维数组
for(int i = 0;i < yanghui.length;i++){
for(int j = 0;j < yanghui[i].length;j++){
system.out.println(yanghui[i][j]);
}
system.out.println();
}
}
}
在此题中,要求使用的是集合中的ArraryList结构,但是思路是一致的,代码如下:
List<List<Integer>> ret = new ArrayList<List<Integer>>();
for (int i = 0; i < numRows; ++i) {
List<Integer> row = new ArrayList<Integer>();
for (int j = 0; j <= i; ++j) {
if (j == 0 || j == i) {
//首末元素赋值
row.add(1);
} else {
//非首末元素赋值
row.add(ret.get(i - 1).get(j - 1) + ret.get(i - 1).get(j));
}
}
ret.add(row);
}
return ret;