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.
思路就是回溯,由下向上的回溯
上图的7就是min(4,1)+6
6就是min(1,8)+5
等等等。
代码如下:
import java.util.ArrayList;
import java.util.List;
/**
* Created by kyle on 2016/6/24.
*/
public class Triangle2 {
public static int minimumTotal(List<List<Integer>> triangle) {
int m = triangle.size();
int n = triangle.get(m-1).size();
int[][] result = new int[m][n];
if(m==0){
return 0;
}
if(m == 1){
return triangle.get(0).get(0);
}
for(int j = 0 ; j < triangle.get(m-1).size(); j++){
result[m-1][j] = triangle.get(m-1).get(j);
}
for(int i = m-2 ; i>=0 ; i--){
for(int j = 0; j <triangle.get(i).size(); j++ ){
result[i][j] = Math.min(result[i+1][j], result[i+1][j+1])
+triangle.get(i).get(j);
}
}
return result[0][0];
}
public static void main(String[] args){
List<List<Integer>> lists = new ArrayList<>();
List<Integer> one = new ArrayList<Integer>();
one.add(1);
lists.add(one);
List<Integer> two = new ArrayList<Integer>();
two.add(2);
two.add(3);
lists.add(two);
System.out.println(minimumTotal(lists));
}
}
上述方法空间复杂度O(n^2),时间复杂度也是O(n^2).如果可以修改triangle的话,空间复杂度可以降到O(1)。时间复杂度不知道有没有更优的解,如有知道,不吝赐教!