力扣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;
    }
};
相关推荐
不会代码的小猴13 分钟前
3. 控件学习1
开发语言·c++·笔记·qt·算法
203号居民2 小时前
LeetCode hot 100 —41. 缺失的第一个正数
数据结构·算法·leetcode
专注仿真4 小时前
问答大模型技术方案算法实现-熵权法融合算法 + 交叉编码器重排算法
人工智能·python·算法·语言模型·问答大模型关键算法·熵权融合算法·交叉编码器重排算法
地平线开发者5 小时前
量化为什么会有损失:从量化误差到精度下降
算法
手写码匠6 小时前
华为云Flexus+DeepSeek征文|Dify 多 Agent 会话管理与上下文工程实战:让智能体“记住该记住的,忘掉该忘掉的“
人工智能·深度学习·算法·aigc
2401_862880826 小时前
数据结构 --- 栈
c语言·数据结构·算法
致Great6 小时前
Qwen3.8-27B 接入 DSH 全流程实测:写代码、跑长任务,都没问题
算法
Tisfy7 小时前
LeetCode 3471.找出最大的几近缺失整数:三种情况判断
算法·leetcode·题解·分类讨论
linux-hzh7 小时前
百日算法修炼 · Day 12
算法·深度优先
额额额对了7 小时前
数据结构:二叉树
c语言·数据结构·算法