标签:rom 位置 size row href 时间 fill ase space
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.
三角形最小路径和。题意是给一个N层的list,每层list有N个元素,请你求自顶而下的最小的路径和。
首先将数组变成一个直角三角形这样易于理解。
[
思路是自下而上的动态规划。题目求的是自上而下的最小路径和,那么也就意味着在每两个相邻的数字之间,要找出一个相对小的数字,才有可能使得整个路径最小,但是如果自上而下这样找的话,其实并不一定能找到整个路径最小的。所以这里创建一个长度为triangle.size() + 1的数组记录最后动态规划的结果。从最后一行开始扫描,在DP数组的每一个位置上的值是当前位置i的数字 + DP数组里面dp[i]和dp[i + 1]的较小的值。最后返回的是dp[0]。
时间O(n^2)
空间O(n)
Java实现
1 class Solution { 2 public int minimumTotal(List<List<Integer>> triangle) { 3 int[] res = new int[triangle.size() + 1]; 4 for (int i = triangle.size() - 1; i >= 0; i--) { 5 for (int j = 0; j < triangle.get(i).size(); j++) { 6 res[j] = Math.min(res[j], res[j + 1]) + triangle.get(i).get(j); 7 } 8 } 9 return res[0]; 10 } 11 }
JavaScript实现
1 /** 2 * @param {number[][]} triangle 3 * @return {number} 4 */ 5 var minimumTotal = function(triangle) { 6 // corner case 7 if (triangle === null || triangle.length === 0) { 8 return 0; 9 } 10 11 // normal case 12 let res = new Array(triangle.length + 1).fill(0); 13 for (let i = triangle.length - 1; i >= 0; i--) { 14 for (let j = 0; j < triangle[i].length; j++) { 15 res[j] = Math.min(res[j], res[j + 1]) + triangle[i][j]; 16 } 17 } 18 return res[0]; 19 };
相关题目
标签:rom 位置 size row href 时间 fill ase space
原文地址:https://www.cnblogs.com/cnoodle/p/13230315.html