triangle- 求从顶向下的三角形的最小路径和问题
来源:互联网 发布:sql查询语句在哪写 编辑:程序博客网 时间:2024/06/05 12:49
- 问题描述:
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. - 问题解析:感觉也这道题虽然是数组,但可以和数组没多大关系,比如直接在原始的triangle上进行操作,这样反而不需要O(n)的空间。好了,开始解析:首先提取出状态转移方程:
path[i][j] = min(path[i-1][j-1], path[i-1][j]) + triangle[i][j] (triangle是个List,但这里将它当做二维数组来看);
首先想到的是直接定义一个二维数组自顶向下不断搜索即可。但是我们观察到实际上当前的状态只和上一层的状态有关。所以我们只需一个临时数组记录上一层的状态,然后迭代计算,这样只需要一个临时数组加一个状态数组,然后在状态数组和临时数组不断转化即可。然而,继续往下考虑,实际上当前的状态只和上一层的相邻数组的转台有关。我们用两个边路temp1和temp2记录上一层的相邻状态,然后不断更新这个值。代码如下:
其中,path[i][j],代表搜索到triangle的第i行第j列。这个方程式意义是很明显的。就是当前的最小路径和对于上一层相邻的最小路径和加上当前的路径。然后不断更新即可。public class Solution { public int minimumTotal(List<List<Integer>> triangle) { if(triangle == null ||triangle.isEmpty()) return 0; int n = triangle.size(), minPath = Integer.MAX_VALUE, temp1,temp2; if(n == 1) return triangle.get(0).get(0); int[] path = new int[n]; path[0] = triangle.get(0).get(0); for(int i = 1; i < n; i++){ temp1 = path[0]; temp2 = path[1]; minPath = Integer.MAX_VALUE; for(int j = 0; j < i + 1; j++){ if(j == 0) path[j] += triangle.get(i).get(j); else if (j == i) path[j] = temp1 + triangle.get(i).get(j); else { path[j] = Math.min(temp1, temp2) + triangle.get(i).get(j); temp1 = temp2; if(j < n-1) temp2 = path[j+1]; } minPath = Math.min(path[j],minPath); } } return minPath; }}此外,这个题也可以直接在List上进行操作,这样反而不需要记录临时变量。
0 0
- triangle- 求从顶向下的三角形的最小路径和问题
- Triangle 三角形从顶到底的最短路径
- Triangle三角形的最小路径和
- Triangle 三角形求最小路径和 @LeetCode
- Triangle 三角形求最小路径和 @leetcode
- LeetCode-120:Triangle (三角形列表的最小路径和) -- medium
- [LeetCode]-Triangle 求三角形中从顶到底最短距离
- “自顶向下,逐步求精”的概念和应用
- Leetcode 120 Triangle 三角形最小路径和
- LeetCode -- Triangle 路径求最小和( 动态规划问题)
- 【LeetCode】triangle求最小和路径
- 自顶向下的考虑问题
- 怎么求编译原理自顶向下分析的first集follow集和select
- “自顶向下, 逐步求精”的程序设计方法。
- 自顶向下、逐步求精的算法设计
- “自顶向下 逐步求精”的设计方法
- 程序设计中自顶向下,逐步求精的方法
- “自顶向下, 逐步求精”的程序设计方法。
- springmvc与struts2的区别
- OneASP 安全公开课,深圳站, Come Here, Feel Safe!
- GDAL栅格矢量化
- 使用mapreduce计算环比的实例
- 记一次黑苹果更换硬盘之旅
- triangle- 求从顶向下的三角形的最小路径和问题
- codeforces 401D Roman and Numbers
- Andriod开发环境搭建
- hdu 5254(暴力穷举)
- java中void
- jquery mobile各类组件刷新方法
- 计算机的编码问题与数据上溢
- Eclipse插件开发JDT组件介绍
- Unity 基础 - Vector3