杨辉三角

题目:

给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。

在杨辉三角中,每个数是它左上方和右上方的数的和。

示例:

输入: 5
输出:
[
     [1],
    [1,1],
   [1,2,1],
  [1,3,3,1],
 [1,4,6,4,1]
]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/pascals-triangle
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

分析:

这道题目的规则实际上已经在题干中给出了,在杨辉三角中第一行和第二行是固定的,从第三行开始中间部分需要计算,但是首位数和末位数固定为1。

第三行需要计算一次,第四行需要计算两次... ...

由于前两行不需要计算,所以如果要求计算3行,那么实际上外层循环只需要执行一次,内层循环也只需要执行一次。如果要求计算4行,那么实际上外层循环只需要执行二次,第一次外层循环的内层循环执行一次,第二次外层循环的内层循环执行两次。

代码:

 

class Solution {
    public List<List<Integer>> generate(int numRows) {
        if (numRows == 0) {
            return new ArrayList<>();
        }
        List<List<Integer>> lists = new ArrayList<>();
        if (numRows >= 1) {
            List<Integer> oneRows = new ArrayList<>();
            oneRows.add(1);
            lists.add(oneRows);
        }
        if (numRows >= 2) {
            List<Integer> twoRows = new ArrayList<>();
            twoRows.add(1);
            twoRows.add(1);
            lists.add(twoRows);
        }
        if (numRows < 3) {
            return lists;
        }
        for (int i = 0; i < numRows - 2; i++) {
            List<Integer> anyRows = new ArrayList<>();
            anyRows.add(1);
            for (int j = 0; j < i + 1; j++) {
                List<Integer> preRows = lists.get(i + 1);
                anyRows.add(preRows.get(j) + preRows.get(j + 1));
            }
            anyRows.add(1);
            lists.add(anyRows);
        }
        return lists;
    }
}

 

posted @ 2020-07-10 16:14  无心大魔王  阅读(183)  评论(0编辑  收藏  举报