刷題系列 - 給出一個帕斯卡三角的行數,返回該行元素,要求複雜度為K(O)

張國平發表於2020-02-23

這道題讓我深深感覺數學才是演算法的核心,不對,是爸爸。


簡單說下題目,帕斯卡三角,如下圖,從第三行開始,除了兩邊的1,其他元素都是上一行兩個左右元素之後,比如第三行的中間的2,就是上面兩個1之和。

如果第一行為0行,那麼給出行數,返回該行所有元素,比如給出3,返回[1,3,3,1]

關於帕斯卡三角,還是很多有趣屬性,可以搜尋,最主要就是和二項式展開係數的關係。


如果不考慮演算法複雜度,其實只要從第一行開始一行一行算下來即可,這樣無論如何就要兩次迴圈巢狀,複雜度是K(O^2)。

如果要K(O)一次迴圈的複雜度,就要思考下數學聯絡了,後面實在想不出搜尋下。發現關係如下:

                                    即第n行第i個(n,i 從 0 開始)是C(i,n),組合計算公式:

                                     刷題系列 - 給出一個帕斯卡三角的行數,返回該行元素,要求複雜度為K(O)

                                    化簡得 : C(i,n) = n * ( n -1) * ... * ( n - i +1) / ( 1 * 2 * ... * i )


慚愧,我的程式碼基本就是他的python版本。https://zhuanlan.zhihu.com/p/42302550

可能稍微優化地方是,這裡先建立了一個行數加以長度的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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章