LeetCode之遞迴 楊輝三角

2021-10-03 07:29:30 字數 1425 閱讀 6878

描述:

給定乙個非負整數 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。...