118. 杨辉三角

题目

  • 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
    在「杨辉三角」中,每个数是它左上方和右上方的数的和。
    在这里插入图片描述
  • 示例 1:
    输入: numRows = 5
    输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
  • 示例 2:
    输入: numRows = 1
    输出: [[1]]
  • 提示:
    1 <= numRows <= 30

题解

vector<vector<int>> generate(int numRows) {  
    vector<vector<int>> triangle;  
      
    if (numRows <= 0) {  
        return triangle;  
    }  
      
    // 添加第一行  
    triangle.push_back(vector<int>{1});  
      
    for (int i = 1; i < numRows; ++i) {  
        vector<int> prevRow = triangle[i-1]; // 获取上一行  
        vector<int> currRow(i+1, 1); // 当前行初始化为1,长度为i+1  
          
        // 填充当前行的中间元素  
        for (int j = 1; j < i; ++j) {  
            currRow[j] = prevRow[j-1] + prevRow[j];  
        }  
          
        // 将当前行添加到结果中  
        triangle.push_back(currRow);  
    }  
      
    return triangle;  
} 

算法原理

  1. 初始化:
  • 创建一个二维向量 triangle 用于存储整个杨辉三角。
  • 如果输入的 numRows 小于等于0,则直接返回一个空的二维向量,因为杨辉三角至少包含一行(即只有一个1的行)。
  1. 添加第一行:
  • 向 triangle 中添加一个只包含一个元素1的向量,作为杨辉三角的第一行。
  1. 逐行生成:
  • 使用一个外层循环,从第2行开始(索引为1,因为索引从0开始),直到 numRows 行。
  • 在每次循环中,首先获取上一行(prevRow),它是 triangle 中的倒数第二个元素(因为 triangle 的最后一个元素是当前正在生成的行,还未添加到结果中)。
  • 创建一个新的行向量 currRow,其长度比 prevRow 多1(因为每向下一行,元素数量就增加一个)。除了首尾元素之外,currRow 的其他元素都初始化为1。
  • 使用一个内层循环,从索引1开始到 prevRow 的长度减1(即不包括 prevRow 的最后一个元素),计算 currRow 中间元素的值。这个值等于 prevRow 中对应位置的上一个元素和当前元素之和(即 prevRow[j-1] + prevRow[j])。
  • 将计算好的 currRow 添加到 triangle 中,作为新的一行。
  1. 结束:
  • 当外层循环结束时,triangle 中就包含了完整的杨辉三角的前 numRows 行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值