119.杨辉三角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)
链接:https://leetcode-cn.com/problems/pascals-triangle-ii。
- 根据性质3求解
利用性质3公式我们得到同一行的相邻组合数的关系
并且每一行第一个元素都为0,所以可以直接计算出第 n 行的所有组合数。
N过大result[i - 1] * (rowIndex - i + 1)
算出来的值int存不下,计算时转为long long
.
vector<int> getRow(int rowIndex) {
vector<int> result(rowIndex + 1);
result[0] = 1;
for (int i = 1; i <= rowIndex; ++i) {
result[i] = 1LL * result[i - 1] * (rowIndex - i + 1) / i;
}
return result;
}
- 根据性质4 求解
每个数字等于上一行的左右两个数字之和,可用此性质写出整个杨辉三角。在本题中只需要第n行的值即可,而第n的第i个值等于第n-1行的第i-1的值加上i的值。所以只需要存储两行的值;而如果通过倒着计算第n的值,那么当前位置前面的仍然是上一行的值,可以进一步的减少存储空间。
vector<int> getRow(int rowIndex) {
vector<int> result(rowIndex + 1);
result[0] = 1;
for (int i = 1; i <= rowIndex; ++i) {
for (int j = i; j > 0; --j) {
result[j] += result[j-1];
}
}
return result;
}