首页
随机
最近更改
特殊页面
社群首页
参数设置
关于WHY42
免责声明
WHY42
搜索
用户菜单
登录
欢迎来到Riguz的小站!这是一个私人wiki,用来记录一些我的笔记。
查看“︁120.Triangle”︁的源代码
←
120.Triangle
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
{{LeetCode id=triangle}} =Description= https://leetcode.com/problems/triangle/ Given a triangle array, return the minimum path sum from top to bottom. For each step, you may move to an adjacent number of the row below. More formally, if you are on index i on the current row, you may move to either index i or index i + 1 on the next row. Example 1: <syntaxhighlight lang="java"> Input: triangle = [[2],[3,4],[6,5,7],[4,1,8,3]] Output: 11 </syntaxhighlight> Explanation: The triangle looks like: <syntaxhighlight lang="java"> 2 3 4 6 5 7 4 1 8 3 </syntaxhighlight> The minimum path sum from top to bottom is 2 + 3 + 5 + 1 = 11 (underlined above). Example 2: <syntaxhighlight lang="java"> Input: triangle = [[-10]] Output: -10 </syntaxhighlight> =Solution= ==First attampt== It works, but not good, especially memory. * Runtime 3 ms * Beats 65.79% * Memory 44.4 MB * Beats 13.95% <syntaxhighlight lang="java"> class Solution { public int minimumTotal(List<List<Integer>> triangle) { int maxRowSize = triangle.get(triangle.size() -1).size(); // create an array nxn to store the minimal distance that starts from triangle[i][j] int[][] dp = new int[maxRowSize][maxRowSize]; for(int i = triangle.size() -1; i >=0; i--) { List<Integer> row = triangle.get(i); for(int j = 0; j < row.size(); j++) { if(i < dp.length -1) { // calculate minimal distance and update dp[i][j] = Math.min(dp[i+1][j], dp[i+1][j+1]) + row.get(j); } else { // for the bottom line, there's no subpaths dp[i][j] = row.get(j); } } } return dp[0][0]; } } </syntaxhighlight> == Memory Optimization== <syntaxhighlight lang="java"> class Solution { public int minimumTotal(List<List<Integer>> triangle) { int maxRowSize = triangle.get(triangle.size() -1).size(); // 只需要记录上一次的最短路径 int[] dp = new int[maxRowSize]; for(int i = triangle.size() -1; i >=0; i--) { List<Integer> row = triangle.get(i); for(int j = 0; j < row.size(); j++) { if(i < dp.length -1) { // 从左到右更新,正好计算右边的元素时,当前的值已经不需要用到了。所以可以直接更新 dp[j] = Math.min(dp[j], dp[j+1]) + row.get(j); } else { dp[j] = row.get(j); } } } return dp[0]; } } </syntaxhighlight> [[Category:Algorithm]] [[Category:Dynamic Programming]] [[Category:LeetCode]]
此页面嵌入的页面:
模板:LeetCode
(
查看源代码
)
模板:Submission
(
查看源代码
)
返回
120.Triangle
。