题目
图解
思路讲解
1.观察图形我们会发现图形的边缘都是1,其中间的值是由头顶上的和前一个数相加得来的。这时候我们重新画了一个更容易观察的直角三角形图。
2.通过观察我们重新画的直角三角形,我觉得这有点像x-y坐标轴。x和y两个维度似乎就可以用二维数组来求解。
3.于是通过设立i行和j列,以及数值3=1+2的规律求得了表达式:
[i][j] = [i-1][j] + [i-1][j-1];
4.根据表达式画出了二维数组,以2=1+1为例子比较容易理解。
我们设立了2所在的行设为curRow,那么1所在的行设为prevRow。
只需求得prev行里的两个1相加就得到了cur。
完整代码
public List<List<Integer>> generate(int numRows) {
//创建一个二维数组
List<List<Integer>> ret = new ArrayList<>();
//创建一个一维数组
List<Integer> list = new ArrayList<>();
//一维数组的头:只有一个1的
list.add(1);
//把一维数组放进二维数组中
ret.add(list);
//
for (int i = 1;i < numRows; i++) {
//设立当前行的数字
List<Integer> curRow = new ArrayList<>();
//每一行的第一个数
curRow.add(1);
//处理中间的数字
List<Integer> prevRow = ret.get(i-1);
//通过行控制中间数字的个数
for (int j = 1; j < i; j++) {
int x = prevRow.get(j) + prevRow.get(j-1);
curRow.add(x);
}
//每一行的最后一个数
curRow.add(1);
//将当前行放进二维数组内
ret.add(curRow);
}
return ret;
}