刷題系列 - 給出一個帕斯卡三角的行數,返回該行元素,要求複雜度為K(O)
這道題讓我深深感覺數學才是演算法的核心,不對,是爸爸。
簡單說下題目,帕斯卡三角,如下圖,從第三行開始,除了兩邊的1,其他元素都是上一行兩個左右元素之後,比如第三行的中間的2,就是上面兩個1之和。
如果第一行為0行,那麼給出行數,返回該行所有元素,比如給出3,返回[1,3,3,1]
關於帕斯卡三角,還是很多有趣屬性,可以搜尋,最主要就是和二項式展開係數的關係。
如果不考慮演算法複雜度,其實只要從第一行開始一行一行算下來即可,這樣無論如何就要兩次迴圈巢狀,複雜度是K(O^2)。
如果要K(O)一次迴圈的複雜度,就要思考下數學聯絡了,後面實在想不出搜尋下。發現關係如下:
即第n行第i個(n,i 從 0 開始)是C(i,n),組合計算公式:
化簡得 : C(i,n) = n * ( n -1) * ... * ( n - i +1) / ( 1 * 2 * ... * i )
慚愧,我的程式碼基本就是他的python版本。
可能稍微最佳化地方是,這裡先建立了一個行數加以長度的0值佇列,這個也是帕斯卡三角的屬性,每一行的元素數是行數加一;因為帕斯卡三角元素是前後對稱,每次就計算前面一個,同時更新前後對稱兩個;當佇列所有元素不為0時候,返回該佇列即是答案。這樣就只用遍歷一半即可。
程式碼如下
class Solution: def getRow(self, rowIndex: int) -> List[int]: rowList = [0 for x in range(rowIndex+1)] m = 1 for i in range(len(rowList)): if i == 0: rowList[0] =1 rowList[rowIndex] = 1 elif rowList[i] != 0: return rowList else: m = int(m*(rowIndex-i+1)/i) rowList[i] = m rowList[rowIndex - i] = m return rowList
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22259926/viewspace-2676811/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 一道看上去很嚇人的演算法面試題:如何對n個數進行排序,要求時間複雜度O(n),空間複雜度O(1)演算法面試題排序時間複雜度
- 一個整型陣列裡除了一個或者兩個或者三個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度是O(n),空間複雜度是O(1)陣列時間複雜度
- Algorithm 04 : 尋找兩個有序陣列中的第N個數,要求時間複雜度為O(logm+logn)Go陣列時間複雜度
- 刷題系列 - 在二叉樹中查詢給出節點,並返回以該節點為根的樹二叉樹
- 時間複雜度O(n)和空間複雜度時間複雜度
- 時間複雜度為O(nlogn)的排序演算法時間複雜度排序演算法
- 時間複雜度為 O (n^2) 的排序演算法時間複雜度排序演算法
- 時間複雜度為 O(nlogn) 的排序演算法時間複雜度排序演算法
- 時間複雜度為 O(n^2) 的排序演算法時間複雜度排序演算法
- 時間複雜度O(1)、O(n)、O(n²)、O(nlogn)的含義時間複雜度
- 【漫畫】為什麼說O(n)複雜度的基數排序沒有快速排序快?複雜度排序
- 如何進行演算法的複雜度分析?演算法複雜度
- 藍橋杯-數三角(ac程式碼時間複雜度分析)C程式時間複雜度
- 隨機列印0-100的全部數字並且不可重複,時間複雜度為O(n)隨機時間複雜度
- 合併兩個有序陣列,其中有一個陣列長度足夠長,在O(1)的空間複雜度裡進行合併陣列複雜度
- Java實現:排序演算法--時間複雜度為O(n² )Java排序演算法時間複雜度
- 第一週:時間複雜度該怎麼看?時間複雜度
- 判斷連結串列是否為迴文結構,空間負責度為O(1),時間複雜度為O(n)時間複雜度
- 正規表示式時間複雜度O(n)時間複雜度
- 刷題系列 - K-th 語法
- 有感於“以複雜性為生的行業”行業
- 複雜度分析的套路及常見的複雜度複雜度
- 查詢連結串列中倒數第k(k為正整數)個位置上的結點,查詢成功輸出該結點的data值,並返回1,否則只返回0
- 快速排序平均時間複雜度O(nlogn)的推導排序時間複雜度
- 複雜度為 O(1) 的「最不常用」快取演算法的 Python 實現複雜度快取演算法Python
- 以P和O(大寫字母O)表示入棧和出棧操作,根據一個P和O的序列,對一個空堆疊進行操作,當進行操作結束後,堆疊為空,則該序列是合法的,否則為非法的
- 刷題系列 - 合併兩個順序佇列為一個新的佇列佇列
- 時間複雜度跟空間複雜度時間複雜度
- 時間複雜度和空間複雜度時間複雜度
- 時間複雜度與空間複雜度時間複雜度
- 給一個介面傳遞引數,並接收返回的引數
- 第一講 複雜度分析複雜度
- 技術人員該如何接手一個複雜的系統?
- 如何不用演算法對陣列進行(0時間複雜度,0空間複雜度)排序?演算法陣列時間複雜度排序
- [golang]一個複雜的中文編碼問題Golang
- scala:函式作為值或引數進行傳遞、作為返回值進行返回函式
- 返回陣列中的最大元素個數陣列
- 複雜度分析複雜度