題目
給定一個非負索引 k,其中 k ≤ 33,返回楊輝三角的第 k 行
輸入: 3
輸出: [1,3,3,1]
來源:https://leetcode-cn.com/problems/pascals-triangle-ii/
解答
方法一:
因爲已經做過一個楊輝三角的題目所以這個題目是沒啥難度的。但是題目在進階的說明裏邊說要使用 O(k)的空間複雜度,這個確實需要思考一下。
分析如下:
- k行 有 k + 1 個元素
- 每行元素的計算方法和上個問題是一樣的
- 重點是下一行元素的計算依賴上一行
- 每一行數據都是對稱的
- 每行需要計算的元素個數是 rowIndex - 1 (兩邊的1排除掉)
問題就變成了如何計算下一行的時候不需要分配新的空間,而且下一行數據的生成不會覆蓋掉計算下一個元素需要的上一行的元素。
試想一下如果我們把元素放置的時候是從左到右的,計算的也是從左到右那麼是避免不了要覆蓋掉。因此在計算的時候可以這麼做,讀取元素的時候從右往左讀,計算完成覆蓋的時候從左往右覆蓋,這樣就不會影響後邊元素的計算。
class Solution {
public:
vector<int> getRow(int rowIndex) {
///第n行有n個元素 行號是 rowIndex + 1
vector<int> res(rowIndex + 1, 1);
if (rowIndex == 0 || rowIndex == 1) {
return res;
}
///從第二行開始計算
//由於數據是對稱的,每一行讀取數據的時候都從右往左讀
for (int i = 2; i <= rowIndex; i++) {
//每行要計算 i - 1個元素
for(int j = 0; j < i - 1; j++) {
// 找到第一個需要計算的元素的未知
int start = rowIndex - (i - 1) + j;
res[start] = res[start] + res[start + 1];
}
}
return res;
}
};