120.三角形最短路径(leetcode)

给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。

法1):

本题典型的回溯算法,但是没有剪枝,在42/43个case的时候超时了,以下是代码。

PS:尝试过如果当前和大于全局最小,则停止,但是由于有负数的存在,现在大的值也可以通过-9999成为最小值,剪枝失败。

class Solution:

def minimumTotal(self, triangle: List[List[int]]) -> int:

if not triangle or not triangle[0]:

return 0

depth = len(triangle)-1

self.minSum = 9999

def helper(curSum,curdepth,j):

if curdepth == depth:

if curSum<self.minSum:

self.minSum = curSum

return

helper(curSum+triangle[curdepth + 1][j],curdepth+1,j)

helper(curSum+triangle[curdepth + 1][j+1],curdepth+1,j+1)

helper(triangle[0][0],0,0)

return self.minSum

法2)动态规划

用动态规划之前,必须想清楚,空间换时间,这里空间存储的是什么。 看了leetcodeID:吴彦祖 的解答之后,他存的是每层每个位置的最优路径和。

Greedy算法行不通的原因就是,同层最优解,在下一层可能变成非最优解,再在下一层变成最优解, 但是同一位置的最优路径不会变,所以可以存储当前位置最优路径和。

        1

           2   4

      4      5    7

       2        3    -10   -999

这样与Greedy算法区别:

Greedy: 从上层到底层遍历,每次取下一层较小值,  这样取的只是下一层的最优解

动态规划: 从上层到底层遍历,每次取上一层较小值,   这样取得是 上面所有层数得最优解, 所以遍历到最底层得时候,就是所有层数最优解,理解了!

class Solution:

def minimumTotal(self, triangle: List[List[int]]) -> int:

if not triangle or not triangle[0]:

return 0

depth = len(triangle)

dp = [[9999 for i in range(j)] for j in range(1,depth+1)]

for i in range(depth):

for j in range(i+1):

if i == 0:

dp[i][j] = triangle[i][j]

elif j == 0:

dp[i][j] = dp[i-1][0] + triangle[i][j]

elif j == i:

dp[i][j] = dp[i-1][i-1] + triangle[i][j]

else:

if dp[i-1][j] < dp[i-1][j-1]:

dp[i][j] = dp[i-1][j] + triangle[i][j]

else:

dp[i][j] = dp[i-1][j-1] + triangle[i][j]

print(dp)

return min(dp[depth-1])

法3) 动态规划 改进空间复杂度O(1)

不设二维数组,直接在triangle上加和

原文地址:https://www.cnblogs.com/ChevisZhang/p/12284002.html

时间: 2024-07-29 04:08:21

120.三角形最短路径(leetcode)的相关文章

#动态规划 LeetCode 120 三角形最小路径和

给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11). 说明: 如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分. 思路: 接着上一题的状态转移继续说 动态规划问题,重中之重就是找到状态转移方程,而状态转移方程很重要的一点就是明确函数的意义所在,以及记录结果

[Leetcode]120.三角形路径最小和

---恢复内容开始--- 题目的链接 简单的动态规划题,使用了二维dp数组就能很好的表示. 由于有边界的问题,所以这个dp数组为 dp[n+1][n+1]. dp[i][j]意思是终点为(i-1,j-1)点的路径最小和. 我们需要把这个三角形变成方阵来看,先看看样例: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 变成方阵之后就变成了 [ [2, INT_MAX,INT_MAX, INT_MAX], [3,               4,INT_MAX, INT_MAX

LeetCode 120——三角形最小路径和

1. 题目 2. 解答 详细解答方案可参考北京大学 MOOC 程序设计与算法(二)算法基础之动态规划部分. 从三角形倒数第二行开始,某一位置只能从左下方或者右下方移动而来,因此,我们只需要求出这两者的较小值然后再加上当前元素,即可得出从某一位置到最下边的最小路径和.以此类推,我们就可以求出最上边元素的最小路径和.过程如下所示: 2 3 4 6 5 7 4 1 8 3 第三行到最下边的最小元素和 7 6 10 3 min(4, 1) + 6 min(1, 8) + 5 min(8, 3) + 7

120. 三角形最小路径和

给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11). 说明: 如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分. 逆向思维,从底向顶部找,状态转移方程 minimus[i][j]=data[i][j]+min(minimums[i+1][j]+minimu

leet

# 题名1 两数之和    2 两数相加    3 无重复字符的最长子串    4 寻找两个有序数组的中位数    5 最长回文子串    6 Z 字形变换    7 整数反转    8 字符串转换整数 (atoi)    9 回文数    10 正则表达式匹配    11 盛最多水的容器    12 整数转罗马数字    13 罗马数字转整数    14 最长公共前缀    15 三数之和    16 最接近的三数之和    17 电话号码的字母组合    18 四数之和    19 删除链表

C#OOP之二 变量和表达式

2.1  C#的基本语法 C#代码的外观和操作方式与C++和Java非常相似.初看起来,其语法比较混乱, 不像书面英语和其他语言.但是,在C#编程中,使用的样式是比较清晰的,不用花太多的力气就可以编写出可读性很强的代码. 与其他语言的编译器不同,无论代码中是否有空格或回车符或tab字符(这些字符统称为空白字符),C#编译器都不考虑这些字符.这样格式化代码时就有很大的自由度,但遵循某些规则将有助于使代码易于阅读. C#代码由一系列语言组成,每一个语句都用一个分号来结束.因为空格被忽略,所以一行可以

矩阵与动态规划相关

目录 54/59螺旋矩阵 62不同路径 64最小路径和 120三角形最小路径和 695岛屿的最大面积 547朋友圈 718最长重复数组 221最大正方形 121/122/123/714/188买卖股票的最佳时机 416分割等和子集 01背包/最近等分子集 70爬楼梯 54/59螺旋矩阵 思路: 设置上下左右四个边界变量 新建ArrayList存储结果 循环:四个循环,左->右,上->下,右->左,下->上.每次循环添加结果,循环后判断边界是否相等了,是的话就退出 // 设置边界变量

Leetcode-动态规划

70. 爬楼梯 https://leetcode-cn.com/problems/climbing-stairs/ 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 解: 暴力,如果只有一阶,就只有一种方法:如果只有二阶,就只有两种方法.那么n阶的方法数就等于n-1阶和n-2阶方法数之和.但直接递归,有太多重复计算,超时.O(2n) class Solution: def climbStairs

动态规划-Dynamic Programming(DP)

动态规划 动态规划方法心得 ? 动态规划是一般的面试.笔试中的高频算法题,熟练掌握必要的.动态规划的中心思想是在解决当前问题时,可以由之前已经计算所得的结果并结合现在的限制条件递推出结果.由于此前的计算结果已经保留下来,所以极大的缩短了时间复杂度. ? 解决动态规划问题的关键是找出状态表达式,即如何由之前的结果推导出现在的结果.另外,有的问题有很多限制条件增加问题的难度,需要剥丝抽茧,将问题解决.在找到状态表达式后,分为三步解决问题: 一. 定义内存空间,用来保存每步结果,并根据题目初始化,有些