LongDz 的数字文墨提案

118. 杨辉三角

3 min

题目

118. 杨辉三角 简单

解法:动态规划

思路

第一段:采用动态规划思想,逐行递推构造,每行的每个元素依赖于前一行相邻两个元素的和。

第二段:正确性基于数学归纳法。基础情况第0行[1]符合定义。假设前i-1行已正确生成,则第i行的首尾元素恒为1,中间元素通过ans[i-1][j-1] + ans[i-1][j]计算,这恰好满足杨辉三角的组合数学性质C(i,j) = C(i-1,j-1) + C(i-1,j),因此每行都能被准确构造,不会遗漏任何正确结果。

第三段:

  • Step 1: 初始化结果数组ans,从第0行开始迭代
  • Step 2: 第0行直接添加{1}
  • Step 3: 对于第i行(i>0),创建临时数组tmp
  • Step 4: 遍历j从0到i,首尾位置添加1,中间位置添加ans[i-1][j-1] + ans[i-1][j]
  • Step 5: 将tmp加入ans,继续下一行直到完成numRows行

复杂度

  • 时间复杂度: O(numRows2)O(numRows^2)
  • 空间复杂度: O(numRows2)O(numRows^2)

代码

class Solution {
public:
    vector<vector<int>> generate(int numRows) {
        vector<vector<int>>ans;
        for(int i = 0;i < numRows;i++){
            if(i == 0){
               ans.push_back({1}); 
            }
            else{
                vector<int>tmp;
                for(int j=0;j <= i;j++){
                    
                    if(j > 0){
                        if(j == i){
                            tmp.push_back(ans[i-1][i-1]);
                        }
                        else{
                            tmp.push_back(ans[i-1][j-1] + ans[i-1][j]);
                        }
                    }
                    else{
                        tmp.push_back(1);
                    }
                    
                }
class Solution {
public:
    vector<vector<int>> generate(int numRows) {
        vector<vector<int>>ans;
        for(int i = 0;i < numRows;i++){
            if(i == 0){
               ans.push_back({1}); 
            }
            else{
                vector<int>tmp;
                for(int j=0;j <= i;j++){
                    
                    if(j > 0){
                        if(j == i){
                            tmp.push_back(ans[i-1][i-1]);
                        }
                        else{
                            tmp.push_back(ans[i-1][j-1] + ans[i-1][j]);
                        }
                    }
                    else{
                        tmp.push_back(1);
                    }
                    
                }
                ans.push_back(tmp);
            }
        }
        return ans;
    }
};