1. 程式人生 > 實用技巧 >每日一題20201206(118. 楊輝三角)

每日一題20201206(118. 楊輝三角)

118. 楊輝三角

思路

如果你非要按照圖片裡的樣子來看的話,會複雜一點,如果你按照這樣的格式:

1
11
121
1331
14641

這樣會好理解一點,每次要計算的數,都是上一行的同位置索引+上一行的上個位置的值,如果上一行的上個位置或者上一行的同樣位置沒有值,則只加上有值的部分。
class Solution:
    def generate(self, numRows: int) -> List[List[int]]:
        # 防止numRows為0的情況,直接return []
        if numRows == 0:
            return []
        # 為了方便,直接新增第一行資料,這樣計算上一行的時候就永遠有值
        ans = [[1]]
        # 索引從1開始,是因為上面我們已經加入了一行資料了
        for i in range(1, numRows):
            # result是每一行的資料
            result = []
            # 為什麼是i+1,因為我們求的當前行的資料總是比上一行多一個
            for j in range(i+1):
                # 如果j-1 < 0了,那麼說明j=0,那麼說明上一行沒有前一個數,直接加
                # 上上一行的同位置數ans[i-1] 這個是上一行 同位置數是ans[i-1][j]
                if j - 1 < 0:
                    result.append(ans[i-1][j])
                # 如果j超出了上一行的索引範圍,那麼直接加上上一個的最後一個數
                elif j > len(ans[i-1]) - 1:
                    result.append(ans[i-1][j-1])
                # 否則都在正常範圍內,直接加上ans[i-1]的j和j-1
                else:
                    result.append(ans[i-1][j-1]+ans[i-1][j])
            ans.append(result)
        return ans

類似的寫法

下面那種做法把兩端固定了1和1,每次只計算中間的內容
class Solution:
    def generate(self, numRows: int) -> List[List[int]]:
        result = []
        for n in range(numRows):
            if n == 0:
                result.append([1])
            elif n == 1:
                result.append([1, 1])
            else:
                result.append([1] + [x+result[n-1][i+1] for i, x in enumerate(result[n-1][:-1])] + [1])
        return result