119.杨辉三角 II

【LetMeFly】119.杨辉三角 II:基于原地滚动的空间优化

力扣题目链接:https://leetcode.cn/problems/pascals-triangle-ii/

给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。

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

 

示例 1:

输入: rowIndex = 3
输出: [1,3,3,1]

示例 2:

输入: rowIndex = 0
输出: [1]

示例 3:

输入: rowIndex = 1
输出: [1,1]

 

提示:

  • 0 <= rowIndex <= 33

 

进阶:

你可以优化你的算法到 O(rowIndex) 空间复杂度吗?

方法一:构造整个杨辉三角

这道题和LeetCode 118.杨辉三角类似。

不同之处在于:

  • 这道题只需要返回最后一行
  • 这道题的行数是从0开始的

那么方法一就是类似LeetCode 118.杨辉三角,返回时只返回最后一行即可。

具体思路可参考https://blog.letmefly.xyz/2022/07/17/LeetCode 0118.杨辉三角/

  • 时间复杂度$O(N^2)$
  • 空间复杂度$O(N^2)$,因为需要存储整个三角

AC代码

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public:
vector<int> getRow(int numRows) {
numRows++;
vector<vector<int>> ans;
ans.push_back({1});
for (int i = 1; i < numRows; i++) {
ans.push_back({1});
for (int j = 1; j < i; j++) {
ans[i].push_back(ans[i - 1][j - 1] + ans[i - 1][j]);
}
ans[i].push_back(1);
}
return ans.back();
}
};

方法二:原地滚动 + 只构造最后一行

不难发现,第$i+1$行的计算只需要用到第$i$行的值。

因此,我们只开辟最后一行的空间,并且原地滚动即可。

原地滚动的时候,记得从后往前计算。

  • 时间复杂度$O(N^2)$
  • 空间复杂度$O(1)$,答案不计入算法空间复杂度

AC代码

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public:
vector<int> getRow(int rowIndex) {
vector<int> ans(rowIndex + 1);
ans[0] = 1;
for (int row = 1; row <= rowIndex; row++) {
ans[row] = 1;
for (int th = row - 1; th > 0; th--) { // 必须是从后往前
ans[th] += ans[th - 1];
}
}
return ans;
}
};

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/125853536


119.杨辉三角 II
https://blog.letmefly.xyz/2022/07/18/LeetCode 0119.杨辉三角II/
作者
Tisfy
发布于
2022年7月18日
许可协议