leetcode:119. 杨辉三角 II
题目
给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。![[简单] 119. 杨辉三角 II - 图1](/uploads/projects/liangduo-rjrcs@ggu4wq/9b2efe20eaaaa17aa45f06ff4dcef165.gif)
示例:
输入: rowIndex = 3输出: [1,3,3,1]
输入: rowIndex = 0输出: [1]
输入: rowIndex = 1输出: [1,1]
解答 & 代码
递推,逐行计算:
设 **result[i][j]** 代表杨辉三角第 **i** 行的第 **j** 个数
result[i][j] = result[i - 1][j - 1] + result[i - 1][j],当1 <= j <= i - 1result[i][0] = result[i][i] = 1,即每行的最左端和最右端等于 1
由于计算每行的第 j 个数都只和前一行有关,因此可以压缩到一维数组 result,**result[j]** 代表当前行的第 **j** 个元素的值
- 当
**1 <= j <= i - 1**:**result[j] = result[j - 1] + result[j]**- 注意:每一行应该倒序遍历!!!因为原本
result[i][j]和上一行的前一个元素result[i - 1][j - 1]有关,压缩为一维数组后,如果正序遍历,那么上一行的第j - 1个元素就已经被当前行的第j - 1个元素覆盖了
- 注意:每一行应该倒序遍历!!!因为原本
**result[0] = result[i] = 1**,即每行的最左端和最右端等于 1class Solution {public:vector<int> getRow(int rowIndex) {int len = rowIndex + 1; // 第 rowIndex 行的元素个数// result[j] 代表当前行的第 j 个元素的值vector<int> result(len, 1); // 结果数组,全部初始化为 1(因为每行的两端都为 1)// 递推for(int i = 2; i <= rowIndex; ++i) // 遍历行{for(int j = i - 1; j >= 1; --j) // 逆序遍历列result[j] = result[j - 1] + result[j];}return result;}};
复杂度分析:设要返回第 rowIndex 行
时间复杂度
:
- 空间复杂度 O(1):结果数组的空间复杂度不计入
执行结果:
执行结果:通过执行用时:0 ms, 在所有 C++ 提交中击败了 100.00% 的用户内存消耗:6.1 MB, 在所有 C++ 提交中击败了 87.56% 的用户
