杨辉三角

18 阅读1分钟

题目

图解

思路讲解

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;
}