力扣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;
    }
};
相关推荐
zyl76510 小时前
FlashAttention 详解:从 GPU 硬件、普通 Attention 到分块计算与 Online Softmax
算法
爱读书的小胖14 小时前
LeetCode 122:买卖股票的最佳时机 II(C)解题分析
算法
结局无敌14 小时前
React Native for OpenHarmony 实战:三方库 react-native-modal-dialog 的鸿蒙化适配指南
深度学习·算法·react native·react.js·harmonyos
OPEN-F14 小时前
ROS2系列教程:上位机建图与导航(原理综合)
算法·机器人
weixin_3077791314 小时前
C++代码实现MATLAB中的fitrtree函数功能
开发语言·c++·算法·matlab
tomwang032215 小时前
路径优化建模、优化算法分类及工程化小结
算法·数学建模·分类
小羊没烦恼!15 小时前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp
2501_9269783315 小时前
人机通信协议--人和机器之间的交互想象
人工智能·经验分享·算法·ai写作
行者全栈架构师15 小时前
【鸿蒙心迹】互动卡片全链路——把核心功能放到桌面(FormKit 实战)(HarmonyOS 7.x)
前端·算法·架构
无定义_15 小时前
10.11日常训练
算法