leetcode 118杨辉三角

复制代码
class Solution {
public:
    vector<vector<int>> generate(int numRows) {
        int i = 0, j = 0;

        // dp[i] 表示杨辉三角的第 i 行
        vector<vector<int>> dp(numRows);

        for(i = 0; i < numRows; i++){

            // 第 i 行有 i+1 个元素
            dp[i].resize(i + 1);

            // 每一行的第一个和最后一个元素都是 1
            dp[i][0] = dp[i][i] = 1;

            // 计算当前行中间的元素
            for(j = 1; j < i; j++){
                // 当前元素 = 上一行左上 + 上一行右上
                dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
            }
        }

        return dp;
    }
};

你现在重点理解这三个地方就行

① 创建二维数组

复制代码
vector<vector<int>> dp(numRows);

相当于先创建 numRows 行:

复制代码
dp[0]
dp[1]
dp[2]
dp[3]
...

但此时每一行还没有具体的元素。


② 决定每一行有几个元素

复制代码
dp[i].resize(i + 1);

例如:

复制代码
i = 0 → dp[0] 有 1 个
i = 1 → dp[1] 有 2 个
i = 2 → dp[2] 有 3 个
i = 3 → dp[3] 有 4 个

所以自然形成:

复制代码
        1
       1 1
      1 2 1
     1 3 3 1

③ 计算中间位置

复制代码
dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];

比如计算:

复制代码
     1  2  1
      ↘ ↙
       3

就是:

复制代码
dp[3][1] = dp[2][0] + dp[2][1];

也就是:

复制代码
3 = 1 + 2

最后记住这个结构

复制代码
dp[i]       → 第 i 行
dp[i][j]    → 第 i 行第 j 个元素

resize(i+1) → 第 i 行开 i+1 个位置

两边 → 1

中间 → 上一行左上 + 上一行右上

所以这道题实际上就是通过每一行长度逐渐增加构造出杨辉三角,再利用上一行计算当前行的中间元素。

相关推荐
喜欢打篮球的普通人17 小时前
AI 编译器内存分配算法:从静态/动态划分到内存复用
人工智能·算法
mjhcsp18 小时前
Code date creation v8.0 竞赛数据生成与对拍实战指南
算法·ai·深度优先·cdc
小郎君65818 小时前
keep-alive 页面怎么“真刷新”?别改外层 key——一个 refreshVersion 的完整实现
vue.js·算法
瑶池酒剑仙18 小时前
C++变量初始化五法完全指南:默认/拷贝/直接/列表/值初始化与窄化转换陷阱(青云之志)
c语言·开发语言·数据结构·c++·算法·visual studio
用户2380030994518 小时前
从零开始实现扫雷游戏(C 语言控制台版)
算法
国科安芯19 小时前
星上计算的第一道防线:低轨遥感卫星载荷处理链中的AS32S601型抗辐射MCU—— 面向高分辨率成像与在轨智能处理的场景化综述
大数据·网络·人工智能·单片机·算法·低轨卫星·抗辐射
thusloop19 小时前
零门槛接入 GPT-6-astra 与 claude-opus-5-5,三大场景实战指南
python·gpt·算法·agent·claude·codex
瓦瓦gogo19 小时前
学回溯算法时,我先弄明白了怎么“退回来”
算法
Lzg_na20 小时前
堆和堆排序
算法
TK泰妞20 小时前
TikTok 带货视频如何做多语言本地化?从翻译脚本到重做场景的实用方法
算法·音视频