LeetCode之遞歸——楊輝三角2(獲取楊輝三角的第N行)

鏈接:獲取楊輝三角的第N行

描述:

給定一個非負索引 k,其中 k ≤ 33,返回楊輝三角的第 k 行。例如,輸入: 3,輸出: [1,3,3,1]。你可以優化你的算法到 O(k) 空間複雜度嗎?

思路:

參考楊輝三角很容易解決該問題,但是要求O(K)空間複雜度,那麼肯定是不滿足要求的。接着上一篇最後說道的優化來說,既然求f(n)時可以將只計算結果的一半,然後複製到另一半,那麼以前的f(0)~f(n-1)也可以這樣計算,此時存放所需要的空間會比以前要少一半,變成((1 + 2 + … + n - 1)/2 + n) = (1+n-1)*(n-1)/4 + n,雖然減少了不少空間,但是仍舊不滿足題目要求。再想一想,其實求f(n)只需要f(n-1)即可,前面求出來的f(0)到f(n-2)都是不需要的,因此我們實際上只需要申請(n - 1 + n)個長度的數組即可以達到題目的要求。這裏爲了簡化代碼,直接生氣2個固定長度的數組,一個存放返回數據,一個存放上一行數據,循環利用。

class Solution {
public:
	vector<int> getRow(int rowIndex) {
		// 初始化2個一維數組,一個存放返回數據,一個存放上一行數據
		vector<vector<int>> ret(2,vector<int>(rowIndex + 1, 1));
		
		for (size_t i = 2; i <= rowIndex; i++)
		{
			for (size_t k = 1; k < i; k++)
			{
				ret[i % 2][k] = ret[(i + 1) % 2][k - 1] + ret[(i + 1) % 2][k];
			}
		}


		// 返回
		return vector<int>(ret[rowIndex % 2].begin(), ret[rowIndex % 2].end());
	}
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章