力扣HOT100(41)动态规划-杨辉三角

一、题目核心规律(一句话讲透)

杨辉三角里,除了每行最左边和最右边的 1,中间的每个数,都等于它「左上方的数 + 正上方的数」。

对应数组下标就是:

第 i 行第 j 个数 = 第 i-1 行第 j-1 个数 + 第 i-1 行第 j 个数

举个例子:

  • 第 3 行(下标 2)的中间数 2 = 第 2 行(下标 1)的 1(j-1=0) + 第 2 行的 1(j=1)
  • 第 4 行(下标 3)的 3 = 第 3 行的 1(j-1=0) + 第 3 行的 2(j=1)

二、先记两个必背的基础性质(和代码直接相关)

  1. 第 i 行(从 0 开始数)有 i+1 个数
    • 第 0 行(第一行):1 个数 → [1]
    • 第 1 行(第二行):2 个数 → [1,1]
    • 第 2 行(第三行):3 个数 → [1,2,1]
  2. 每行的第一个数和最后一个数,永远是 1
    • 不管哪一行,ret[i][0] = 1,ret[i][i] = 1

完整解题步骤

我们的目标是生成前 numRows 行,所以思路很直接:一行一行生成,用上一行的结果算当前行。

  1. 初始化结果数组 :创建一个二维数组 ret,大小为 numRows 行
  2. 遍历每一行 :从第 0 行到第 numRows-1 行
  3. 初始化当前行 :
    • 给当前行分配 i+1 个空间(因为第 i 行有 i+1 个数)
    • 把当前行的第一个和最后一个元素设为 1
  4. 计算当前行中间的数 :
    • 从第 1 个位置到第 i-1 个位置(首尾已经是 1 了,不用算)
    • 每个位置的值 = 上一行的 j-1 位置 + 上一行的 j 位置
  5. 所有行生成完毕,返回结果数组
cpp 复制代码
class Solution {
public:
    vector<vector<int>> generate(int numRows) {
        
        vector<vector<int>> ret(numRows);
        for(int i=0;i<numRows;i++){
            //遍历每一行.

            //给这个一维数组开辟出 k 个格子,准备好位置放数据。
            ret[i].resize(i+1);
            //先把头和尾变成1
            ret[i][0] = ret[i][i] = 1;
            //其他位置
            for(int j=1;j<i;j++){
                ret[i][j] = ret[i-1][j] + ret[i-1][j-1];
            }
        }
        return ret;
    }
};
相关推荐
猿人谷5 分钟前
Surrogate Model:让进化算法学会“预测”,为什么它正在成为智能优化的重要技术?
后端·算法·架构
文丑颜不良啊1 小时前
LeetCode2241~2260题目解析
java·leetcode
文丑颜不良啊1 小时前
LeetCode2321~2340题目解析
java·leetcode
青少儿编程课堂2 小时前
蓝桥杯青少组图形化 STEMA 省考(报名倒计时·11/22开考)+ 全国青少年信息素养大赛 2026—2027赛季 + 电子学会图形化考级:校园华容道大闯关
c++·python·算法·bfs·信息学竞赛
在猴站学算法3 小时前
(《统计学习方法》(第2版) 李航)第2章 感知机算法
学习·算法·机器学习·统计学习
Rainmicro3 小时前
【无标题】
java·数据库·算法
NEFU_Jyj13 小时前
牛客周赛R168
算法
文丑颜不良啊20 小时前
LeetCode2221~2240题目解析
java·leetcode