每日一题:杨辉三角

地址

难度

简单

题目

给定一个非负整数 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

思路

  • 递归

递归方法总而言之就是抓住三点:

  • 找整个递归的终止条件
  • 找返回值
  • 一次递归需要如何操作

找整个递归的终止条件

分析一下题目,递归到numRows = 0 时或者numRows = 1时都可以终止,因为第一行比较特殊,只有一个1,可以将其当成整个递归的终止条件,当numRows = 1时,就可以终止递归向下返回值了。

找返回值

题目要我们求的是整个杨辉三角的所有数,那最后递归得到的应该就是 List<List> (题目给定),也就是每递归完一层,就更新完List并返回即可,最后递归完成就是我们要的答案。

一次递归需要如何操作

只需要关注一次递归即可,因为每一层递归的过程都是一样的,只需要找到最上层的递归的规律,就可以了。

class Solution {
    public List<List<Integer>> generate(int numRows) {
    		//存储要返回的杨辉三角
        List<List<Integer>> dg = new ArrayList<>();
        //若0行,则返回空
        if(numRows == 0){
            return dg;
        }
        //递归出口,这是第一步!找到出口
        if(numRows == 1){
            dg.add(new ArrayList<>());
            dg.get(0).add(1);
            return dg;
        }
        //递归,注意返回值!!!这是第二步
        dg = generate(numRows-1);
        //一级递归要做啥,我们可以看第二行到第三行需要做啥
        //首先是要申请一个list来存储第三行,然后通过第二行得到第三行
        //第三行的首尾为1是确定了的,然后就是中间的数如何得到
        //通过观察很容易拿到for循环里面的式子
        //最后别忘了返回值!!!
        List<Integer> row = new ArrayList<>();
        row.add(1);
        for(int j = 1;j < numRows - 1;j++){
            row.add(dg.get(numRows-2).get(j-1) + dg.get(numRows-2).get(j));
        }
        row.add(1);
        dg.add(row);
        return dg;
    }
}
  • 动态规划

用一个二维数组dp[numRows][numRows]保存每一次动态规划的结果

1.令dp[0][0]=1(第一列)

2.根据以下表格找到规律

得到如下规律(以下情况均为列数大于1)if(col==0){ dp[row][col]=1 } else { dp[row][col]=dp[row-1][col-1]+dp[row-1][col] }

class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> list = new ArrayList<List<Integer>>();
        for (int i = 0; i < numRows; i++) {
            List<Integer> tList = new ArrayList<Integer>();
            for (int j = 0; j <= i; j++) {
                if (j == 0 || i == j) {
                    tList.add(1);
                } else {
                    tList.add(list.get(i - 1).get(j - 1) + list.get(i - 1).get(j));
                }
            }
            list.add(tList);
        }
        return list;
    }
}