力扣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;
    }
};
相关推荐
Sw1zzle3 分钟前
算法入门(四):二叉树 - 递归遍历三件套
算法·leetcode
万法若空31 分钟前
【算法-查找】查找算法
java·数据结构·算法
海石40 分钟前
子树怎么找?树的3种遍历方式来帮忙!
算法·leetcode
海石43 分钟前
难度分 1588:思路 + 技巧 = AC
算法·leetcode
珠海西格电力4 小时前
云边端协同架构:零碳园区管理系统的技术底座
大数据·运维·人工智能·算法·架构·能源
还有多久拿退休金6 小时前
让飞书知识库跟着 commit 自己长:一套自动化知识库的真实实现
前端·算法·架构
KaMeidebaby7 小时前
卡梅德生物技术快报|小 RNA 适配体合成 + 多方法亲和力表征全流程标准化操作手册
前端·网络·数据库·人工智能·算法
是Dream呀7 小时前
基于深度学习的人类行为识别算法研究
人工智能·深度学习·算法
happyprince8 小时前
03_NVIDIA_ModelOpt-量化算法深入
人工智能·深度学习·算法
大鱼>8 小时前
AI+货物追踪:智能快递柜追踪系统
人工智能·深度学习·算法·机器学习