描述:
給定乙個非負整數 numrows,生成楊輝三角的前 numrows 行。比如給定5,則生成以下陣列。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
思路:
既然是講遞迴,那麼就先尋找規律。根據楊輝三角的定義,很容易的知道第n行和第n+1行元素之間的關係——假設低n行的資料為f(n),f(n,x)為第n行的x個元素,則f(n+1,x) = f(n,x-1) + f(n,x)。可以很容易的想到通過遞迴得到任意行的資料,之後只要遍歷n遍即可得到想要的楊輝三角了。**如下:
class
solution
return ret;
}// 得到楊輝三角中指定行的資料
vector<
int>
getline
(int row)
vector<
int> vlast =
getline
(row -1)
;int nvalue = vlast[i -1]
+ vlast[i]
; ret.
push_back
(nvalue);}
return ret;}}
;
問題:
雖然很容易的解決了問題,但是這裡存在乙個弊端,就是執行超時。因為當為了獲取f(n+1)的資料時,它會先獲取f(n),但是f(n)又依賴於f(n-1),這樣當為了 得到f(5)的資料,f(4)被呼叫2次,f(3)被呼叫4次,f(2)被呼叫8次,造成時間和空間上成指數的開銷。為了解決這個問題,非遞迴實現是乙個更好的選擇。非遞迴實現
vectorint>>
generate
(int numrows)
row.
push_back
(ret[i -1]
[k -1]
+ ret[i -1]
[k]);}
ret.
push_back
(row);}
return ret;
}
這個解法大比遞迴不管是時間還是空間複雜度都降低了很多,但其實還可以做進一步的優化。仔細觀察,楊輝三角的每一行都是對稱的,此時只需要獲取f(n)中的0~n/2+1的資料,然後將他們複製到後面即可。優化的**這裡就不再給出了(因為我懶_)
LeetCode 楊輝三角
給定乙個非負整數 numrows,生成楊輝三角的前 numrows 行,在楊輝三角中,每個數是它左上方和右上方的數的和。思路分析 1 第一行是固定的,只有乙個1。2 第二行也是固定的,有兩個1。3 任意一行的開頭結尾都是1。4 第 i 行一共有 i 列。5 第 i 行的第 j 列,該數字是根據 i ...
leetcode解題之楊輝三角
給定乙個非負整數 numrows,生成楊輝三角的前 numrows 行。在楊輝三角中,每個數是它左上方和右上方的數的和。示例 輸入 5輸出 1 1,1 1,2,1 1,3,3,1 1,4,6,4,1 完全是按照資料的正向邏輯暴力編碼,對於第 一 第二行作為基礎資料。class solution if...
楊輝三角(遞迴)c
洛谷t131253 楊輝三角 遞迴 題目描述 設計遞迴程式,計算並輸出楊輝三角的前n行。輸入格式 第一行乙個正整數n,意義見描述。輸出格式 輸出n行,表示前n行的楊輝三角。行內元素以乙個空格隔開。輸入輸出樣例 輸入 1 4輸出 1 111 1211331 說明 提示 對於98 的資料,1 n 25。...