【Hot 100 刷题计划】 LeetCode 118. 杨辉三角 | C++ 动态规划题解

LeetCode 118. 杨辉三角 | C++ 数组模拟与动态规划题解

📌 题目描述

题目级别:简单

给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。

在「杨辉三角」中,每个数是它左上方和右上方的数的和。


💡 解题思路:数组模拟 / 基础动态规划

生成杨辉三角的过程,本质上就是一个非常基础的动态规划(或递推)过程。我们可以将其看作是一个二维数组,只是每一行的长度在递增。

通过观察杨辉三角的排布规律,我们可以总结出两个核心的生成规则:

  1. 边界规则 :每一行的第一个元素和最后一个元素永远是 1
    • 对应代码逻辑:当列索引 j == 0(首位)或者 j == i(末位)时,该位置的值赋为 1
  2. 内部推导规则(状态转移方程) :除首尾元素外,内部的任何一个数字,都等于它正上方 的数字与左上方 的数字之和。
    • 对应代码逻辑:res[i][j] = res[i - 1][j - 1] + res[i - 1][j]

图解推导过程

假设我们要计算第 3 行(索引为 i = 2)的中间元素(索引为 j = 1):

  • 左上方元素:第 2 行(i - 1 = 1)的第 1 个元素(j - 1 = 0),即 res[1][0]
  • 右上方(正上方)元素:第 2 行(i - 1 = 1)的第 2 个元素(j = 1),即 res[1][1]
  • 得出:res[2][1] = res[1][0] + res[1][1]

💻 C++ 代码实现

cpp 复制代码
class Solution {
public:
    vector<vector<int>> generate(int numRows) {
        // 初始化外层 vector,总共有 numRows 行
        vector<vector<int>> res(numRows);

        for (int i = 0; i < numRows; i++) {
            // 动态分配当前行的空间,第 i 行有 i + 1 个元素
            res[i].resize(i + 1);
            
            // 遍历当前行的每一个位置
            for (int j = 0; j <= i; j++) {
                // 边界条件:每一行的第一个和最后一个元素固定为 1
                if (j == 0 || j == i) {
                    res[i][j] = 1;
                } 
                // 状态转移:中间元素 = 左上方元素 + 右上方元素
                else {
                    res[i][j] = res[i - 1][j - 1] + res[i - 1][j];
                }
            }    
        }

        return res;
    }
};
相关推荐
知识领航员16 小时前
蘑兔AI音乐深度实测:功能拆解、实测表现与适用场景
java·c语言·c++·人工智能·python·算法·github
如何原谅奋力过但无声17 小时前
【灵神高频面试题合集06-08】反转链表、快慢指针(环形链表/重排链表)、前后指针(删除链表/链表去重)
数据结构·python·算法·leetcode·链表
jf加菲猫18 小时前
第21章 Qt WebEngine
开发语言·c++·qt·ui
码农-阿杰18 小时前
深入理解 synchronized 底层实现:从 HotSpot C++ 源码看对象锁与 Monitor 机制
开发语言·c++·
Szime19 小时前
深智微IC华润微代理:MCU选型与工业控制方案推荐
c++
叼烟扛炮19 小时前
C++ 知识点18 内部类
开发语言·c++·算法·内部类
汉克老师19 小时前
GESP5级C++考试语法知识(十五、分治算法(二))
c++·算法·排序算法·分治算法·gesp5级·gesp五级
汉克老师20 小时前
GESP6级C++考试语法知识(五、格雷码)
c++·算法·位运算·异或·gesp6级·gesp六级·格雷码
程序leo源21 小时前
C语言知识总结
c语言·开发语言·c++·经验分享·笔记·青少年编程·c#
沫璃染墨21 小时前
二叉搜索树完全指南:从核心原理到增删查改全实现
开发语言·c++