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

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

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

相关推荐
wanderist.4 小时前
线性筛法详解:从筛质数到欧拉函数、Möbius 函数与约数函数
java·数据结构·算法
All for pursuit.4 小时前
【设计-1】208.实现Trie (前缀树)
数据结构·c++·算法·leetcode
weixin_307779134 小时前
C++代码实现MATLAB中的crossval函数功能
开发语言·c++·算法·matlab
青少儿编程课堂5 小时前
背包问题(0/1 背包与完全背包)解题精讲——动态规划入门
c++·python·算法·bfs·信息学竞赛
光影少年5 小时前
为什么 JavaScript 中 0.1 + 0.2 !== 0.3,如何让其相等?
前端·javascript·算法
HEJOO95 小时前
Linux 设备驱动系列——使用全局工作队列
java·linux·算法
Code_Solitude5 小时前
c语言:递归
java·c语言·算法
我命由我123456 小时前
Photoshop - Photoshop 使用内容识别填充移除对象
学习·职场和发展·产品运营·求职招聘·职场发展·学习方法·photoshop
edtoplort6 小时前
OpenAI紧急叫停GPT-6.1 Astra训练,奥尔特曼为何踩刹车
人工智能·gpt·算法