标签:triangle get int 120 算法 Integer LeetCode dp size
题目描述:
给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。
例如,给定三角形:
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。
说明:
如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。
原题地址:https://leetcode-cn.com/problems/triangle/submissions/
题目思路:
这道题可以用递归(回溯)解答,但是时间复杂度是O(a^n),若是采用动态递归的话,时间复杂度只需要O(m*n),空间复杂度由O(m*n)还可以优化成O(n)。
dp[][]设置成2维的,和triangle维度一样,刚开始先初始化最后一行,和triangle最后一行一样。
转移方程:
dp[i][j] = min{dp[i+1][j], dp[i+1][j+1]} + triangle[i][j]
这个其实也可以优化,我们把行省略,dp设置成1维的,因为每个值只依赖当前值和它右侧的一个值,这样从左到右遍历的时候,就可以覆盖上一次的值了,不会影响最后结果。
dp[j] = min{dp[j], dp[j+1]} + triangle[i][j]
题目代码:
解法1:空间复杂度是O(m*n)。
public int minimumTotal(List<List<Integer>> triangle) { Integer[][] dp = new Integer[triangle.size()][triangle.get(triangle.size() - 1).size()]; //初始化 for (int i = 0; i < dp[0].length; i++) { dp[dp.length - 1][i] = triangle.get(dp.length - 1).get(i); } //状态转移方程 for (int i = triangle.size() - 2; i >= 0; i--) { for (int j = 0; j < triangle.get(i).size(); j++) { dp[i][j] = Integer.min(dp[i + 1][j], dp[i + 1][j + 1]) + triangle.get(i).get(j); } } return dp[0][0]; }
解法2:空间复杂度是O(n)。
public int minimumTotal(List<List<Integer>> triangle) { Integer[] dp = new Integer[triangle.size()]; //初始化 for (int i = 0; i < dp.length; i++) { dp[i] = triangle.get(triangle.size() - 1).get(i); } //状态转移方程 for (int i = triangle.size() - 2; i >= 0; i--) { for (int j = 0; j < triangle.get(i).size(); j++) { dp[j] = Integer.min(dp[j], dp[j + 1]) + triangle.get(i).get(j); } } return dp[0]; }
标签:triangle,get,int,120,算法,Integer,LeetCode,dp,size 来源: https://www.cnblogs.com/DarrenChan/p/11074144.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。