leetcode算法118. 杨辉三角

145 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情

一、题目描述:

118. 杨辉三角 - 力扣(LeetCode) (leetcode-cn.com)   给定一个非负整数 numRows 生成「杨辉三角」的前 numRows 行。

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

1626927345-DZmfxB-PascalTriangleAnimated2.gif

示例 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

二、思路分析:

杨辉三角是一种递推的数学三角。每一个元素对应的是上一行相邻两元素的和。 给出初始条件以后,即在确保行数大于等于二时(如果不是则直接返回对应正确答案),先将前两行推入ans的向量中,然后将保存当前行的向量line(一维数组)清空后先压入起始的1(注意,此轮循环结束后也要压入末尾的1),重点是中间部分的处理。
根据观察可得知,递推的关係为:
line[i]=上一行[i-1]+上一行[i]

如果当前行为j,则上一行可用ans[j-1]表示,上一行的第i个可用ans[j-1][i]表示。
注意到每一行拥有的元素个数和行数相同,例如,第一行有1个元素,第二行有两个元素,以此类推。

由此可知道每一行循环的次数为当前行数-2(因爲首尾均为1)

三、AC 代码:

class Solution {
public:
    vector<vector<int>> generate(int numRows) {
        if(numRows==0) return {};
        if(numRows==1) return {{1}};
        vector<vector<int>> ans;
        vector<int> line={1,1};
        ans.push_back({1});
        ans.push_back(line);
        for(int i=3;i<=numRows;i++){
            line.clear();
            line.push_back(1);
            for(int j=1;j<i-1;j++){
                line.push_back(ans[i-2][j-1]+ans[i-2][j]);//i等於行數但是計數是從零開始的,所以上一行不是i-1,而是i-2,因爲這一行是i-1
            }
            line.push_back(1);
            ans.push_back(line);
        }
        return ans;
    }
};

四、参考:

【详细注释版】按数学定义老老实实添加即可 0ms-6.7MB - 杨辉三角 - 力扣(LeetCode)