leetcode 118. 杨辉三角

157 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

题目描述

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

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

示例 1:


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

示例 2:

输入: numRows = 1 输出: [[1]]

提示:

1 <= numRows <= 30

题解

1.前两行的内容固定,进行特殊判断.

  • 当集合数量为1,返回集合[1]
  • 当集合数量为2,返回集合[1],[1,1];

2.双从循环开始进行操作,从第三行开始 (i=2),第二重循环从数组到当前行数(j=0;j≤i)

  • 对数组首部和尾部进行判断(j==0 || j == i),这两个位置为1
  • 除了上面的特殊情况,当前位置的数等于上一个数组的当前位置+前一个位置的和
  • 将当前数组放入数组集合中,临时数组等于当前数组
class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> arrayLists = new ArrayList<>();
        ArrayList<Integer> integers1 = new ArrayList<>();
        integers1.add(1);
        arrayLists.add(integers1);
        if (numRows == 1) {
            return arrayLists;
        }
        ArrayList<Integer> integers2 = new ArrayList<>();
        integers2.add(1);
        integers2.add(1);
        arrayLists.add(integers2);
        if (numRows == 2) {
            return arrayLists;
        }
        // 记录上一个数组
        ArrayList<Integer> temp = integers2;
        // 从第三个开始
        for (int i =2; i < numRows; i++) {
            ArrayList<Integer> integers = new ArrayList<>();
            for (int j = 0; j <= i; j++) {
                // 每行的第一位和最后一位都为1
                if (j == 0 || j == i) {
                    integers.add(1);
                }else {
                    integers.add(temp.get(j) + temp.get(j-1));
                }
            }
            arrayLists.add(integers);
            temp = integers;
        }
        return arrayLists;
    }
}

image.png