119. 杨辉三角 II
目录
一、问题描述
二、解题思路
三、代码
四、复杂度分析
一、问题描述
给定一个非负索引 rowIndex
,返回「杨辉三角」的第 rowIndex
行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
二、解题思路
思路分析:
-
第 0 行是
[1]
-
第 1 行是
[1, 1]
-
第 2 行是
[1, 2, 1]
-
第 3 行是
[1, 3, 3, 1]
-
第 4 行是
[1, 4, 6, 4, 1]
-
…
每一行的数字规律是:
-
首尾都是
1
-
中间的数字 = 上一行的相邻两个数字之和。
做法:
-
初始化第 0 行
[1]
-
不断推导下一行,一直推到第
rowIndex
行。
三、代码
class Solution {
public:vector<int> getRow(int rowIndex) {vector<int> row = {1}; // 第 0 行就是 [1]for (int i = 1; i <= rowIndex; ++i) {row.push_back(0); // 扩展一位,方便从后往前更新for (int j = i; j > 0; --j) {row[j] = row[j] + row[j-1]; // 从后往前更新,避免覆盖}}return row;}
};
详细解释:
-
row
初始是[1]
-
每次扩展一位,比如变
[1, 0]
-
然后从最后一位往前计算:
-
row[j] = row[j] + row[j-1]
-
-
因为从后往前,所以不会覆盖前面需要用的数字。
🧠 举个推导过程例子(比如 rowIndex = 3):
-
第 0 行:[1]
-
第 1 行:扩展一位 ->
[1, 0]
-
j = 1:
row[1] = row[1] + row[0] = 0 + 1 = 1
→[1, 1]
-
-
第 2 行:扩展一位 ->
[1, 1, 0]
-
j = 2:
row[2] = row[2] + row[1] = 0 + 1 = 1
-
j = 1:
row[1] = row[1] + row[0] = 1 + 1 = 2
→[1, 2, 1]
-
-
第 3 行:扩展一位 ->
[1, 2, 1, 0]
-
j = 3:
row[3] = row[3] + row[2] = 0 + 1 = 1
-
j = 2:
row[2] = row[2] + row[1] = 1 + 2 = 3
-
j = 1:
row[1] = row[1] + row[0] = 2 + 1 = 3
→[1, 3, 3, 1]
-
最终返回 [1, 3, 3, 1]
。
四、复杂度分析
-
时间复杂度:O(rowIndex2)O(rowIndex^2)O(rowIndex2)(两层循环)
-
空间复杂度:O(rowIndex)O(rowIndex)O(rowIndex)(只用一个数组)