美文网首页动态规划
[DP/BackTracking]120. Triangle

[DP/BackTracking]120. Triangle

作者: 野生小熊猫 | 来源:发表于2019-02-25 03:01 被阅读0次
  • 分类:DP/BackTracking
  • 时间复杂度: O(n^2)
  • 空间复杂度: 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.经典动态规划,我竟然能自己写出来,感激涕零!!!
2.DP的题目都可以用BackTracking做!
3.注意边界,注意bug free!!!

相关文章

  • [DP/BackTracking]120. Triangle

    分类:DP/BackTracking 时间复杂度: O(n^2) 空间复杂度: O(1) 120. Triangl...

  • [DP]120. Triangle

    题目链接:120. Triangle - medium注意理解题意!下一步必须是这一node的左子结点,或右结点,...

  • Matrix DP - 120. Triangle

    https://leetcode.com/problems/triangle/description/ 代码:

  • Leetcode-120Triangle

    120. Triangle Given a triangle, find the minimum path sum...

  • LeetCode 120. Triangle

    10-16 LeetCode 120. Triangle Triangle Description Given a...

  • Leetcode【120、611、813、915】

    问题描述:【DP】120. Triangle 解题思路: 这道题是给一个三角形,从顶到下计算最小路径和。 容易想到...

  • Triangle

    //120. TriangleGiven a triangle, find the minimum path su...

  • 120. Triangle

    top to down的方案状态转移: f(x,y) = min(f(x-1, y-1), f(x-1, y)) ...

  • 120. Triangle

    Given a triangle, find the minimum path sum from top to b...

  • 120. Triangle

    https://leetcode.com/problems/triangle/description/解题思路:d...

网友评论

    本文标题:[DP/BackTracking]120. Triangle

    本文链接:https://www.haomeiwen.com/subject/xmniyqtx.html