LeetCode Triangle
2016-03-20 16:24
281 查看
LeetCode解题之Triangle
原题
将一个二维数组排列成金字塔的形状,找到一条从塔顶到塔底的路径,使路径上的所有点的和最小,从上一层到下一层只能挑相邻的两个点中的一个。注意点:
最好将空间复杂度控制在O(n),n是金字塔的高度
例子:
输入:
[ [2], [3,4], [6,5,7], [4,1,8,3] ]
输出: 11 (2 + 3 + 5 + 1 = 11)
解题思路
典型的动态规划问题,先将问题转化一下,把每一行的数列都左对齐,如下:[ [2], [3,4], [6,5,7], [4,1,8,3] ]
可以看出来,其实上一行到下一行就两个选择,横坐标不变或加一。dp[i]表示从底层到这一层的第i个元素所有路径中最小的和。递推关系就是
dp[j] = triangle[i][j] + min(dp[j], dp[j + 1]),即下一行与它相邻的两个节点中和比较小的再加上它自己的值。
AC源码
class Solution(object): def minimumTotal(self, triangle): """ :type triangle: List[List[int]] :rtype: int """ n = len(triangle) dp = triangle[-1] for i in range(n - 2, -1, -1): for j in range(i + 1): dp[j] = triangle[i][j] + min(dp[j], dp[j + 1]) return dp[0] if __name__ == "__main__": assert Solution().minimumTotal([ [2], [3, 4], [6, 5, 7], [4, 1, 8, 3] ]) == 11
欢迎查看我的Github (https://github.com/gavinfish/LeetCode-Python) 来获得相关源码。
相关文章推荐
- 【边喝caffee边Caffe 】(三) Check failed: registry.count(t ype) == 1 (0 vs. 1) Unknown layer type
- 二维图形的矩阵变换(三)——在WPF中的应用矩阵变换
- 二维图形的矩阵变换(三)——在WPF中的应用矩阵变换
- 关于git托管的一些心得
- SVD:奇异值分解
- ansible playbook实战——下发部署nginx以及更新、回滚
- DOM事件处理程序学习随笔1(IMOOC)
- Java String理解
- hdu2079选课时间(背包)
- getParameter和getParameterValues
- 二维图形的矩阵变换(二)——WPF中的矩阵变换基础
- java集合框架——Map
- Hibernate逍遥游记-第9章 Hibernate的映射类型
- 97. Interleaving String
- 安卓基础:自定义控件实现ViewPager指示器
- Servlet 工作原理解析
- File类通过递归列出目录的结构
- 二维图形的矩阵变换(一)——基本概念
- 关于css中的opacity
- 《Java高级程序设计》第二次作业