[DP/BackTracking]120. Triangle

  • 分類:DP/BackTracking
  • 時間復(fù)雜度: O(n^2)
  • 空間復(fù)雜度: O(1)

120. Triangle

Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below.

For example, given the following triangle

[
     [2],
    [3,4],
   [6,5,7],
  [4,1,8,3]
]

The minimum path sum from top to bottom is 11 (i.e., 2 + 3 + 5 + 1 = 11).

Note:

Bonus point if you are able to do this using only O(n) extra space, where n is the total number of rows in the triangle.

代碼:

DP代碼:

class Solution:
    def minimumTotal(self, triangle: List[List[int]]) -> int:
        
        #判定邊界條件
        if not triangle:
            return -1
        if len(triangle)==1:
            return triangle[0][0]
        
        for i in range(1,len(triangle)):
            for j in range(len(triangle[i])):
                if j==0:
                    triangle[i][j]+=triangle[i-1][j]
                elif j==len(triangle[i])-1:
                    triangle[i][j]+=triangle[i-1][j-1]
                else:
                    triangle[i][j]+=min(triangle[i-1][j],triangle[i-1][j-1])
                    
        smallest=triangle[len(triangle)-1][0]        
        for j in range(1,len(triangle[i])):
            smallest=min(smallest,triangle[len(triangle)-1][j])
                    
        return smallest

BackTracking代碼:

class Solution:
    def minimumTotal(self, triangle: List[List[int]]) -> int:
        
        #判定邊界條件
        if not triangle:
            return -1
        
        res=self.helper(triangle,len(triangle))

        #求最小值
        smallest=res[0]
        for j in range(1,len(res)):
            smallest=min(smallest,res[j])
                    
        return smallest
    
    def helper(self,triangle,level):
        #定義出口
        if level==1:
            return triangle[0]
        
        prev=self.helper(triangle,level-1)

        for i in range(0,level):
            if i==0:
                triangle[level-1][i]+=prev[i]
            elif i==level-1:
                triangle[level-1][i]+=prev[i-1]
            else:
                triangle[level-1][i]+=min(prev[i],prev[i-1])

        return triangle[level-1]

討論:

1.經(jīng)典動態(tài)規(guī)劃,我竟然能自己寫出來,感激涕零?。?!
2.DP的題目都可以用BackTracking做!
3.注意邊界,注意bug free?。。?/p>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi閱讀 7,854評論 0 10
  • 親親的人, 親親的人?。?你不要離開故鄉(xiāng)去, 天空的美麗早就不可言。 我會努力讓時間和世界團圓。 團圓的月兒不在天...
    忠彧閱讀 215評論 0 3
  • 不知不覺,明天就要結(jié)束李白的課程了,我竟有些依依不舍。從那個一點也不喜歡甚至很討厭他的小孩變成了一個從心眼里...
    過過_35fe閱讀 641評論 0 0

友情鏈接更多精彩內(nèi)容