力扣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] = 1ret[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;
    }
};
相关推荐
Cthy_hy1 小时前
Python算法竞赛:集合去重+字典映射 核心用法一站式整理
数据结构·python·算法
Deepoch2 小时前
Deepoc数学大模型:驱动发动机行业数智化转型的底层解
人工智能·算法·deepoc·数学大模型
happymaker06262 小时前
LeetCodeHot100——盛水最多的容器
数据结构·算法·leetcode·双指针·hot100
3DVisionary2 小时前
蓝光三维扫描:磁性轴承全尺寸精密3D检测方案
算法·3d·3d检测·蓝光三维扫描·精密检测·磁性轴承·圆度测量
过期动态2 小时前
【LeetCode 热题 100】三数之和
java·数据结构·算法·leetcode·职场和发展·排序算法
逻辑君2 小时前
Foresight研究报告【20260010】
人工智能·算法·机器学习
weixin_468466852 小时前
大语言模型原理新手入门指南
人工智能·python·算法·语言模型·自然语言处理·transformer·注意力机制
z200509302 小时前
今日算法(回溯找IP,加检测)
算法·leetcode
sheeta19982 小时前
LeetCode 补拙笔记 日期:2026.05.29 题目:1559. 二维网格图中探测环
笔记·算法·leetcode