首页 > 代码库 > Triangle

Triangle

Triangle

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).

用DP主要还是要找出递推关系,边界条件

这里的递推关系miniPaht[i][j]表示第i层第j个点的最短路径

miniPath[i][j] = min{miniPath[i - 1][j], miniPath[i - 1][j - 1]} + triangle.get(i).get(j)

注意i和j等于0和等于 triangle.get(i).size - 1的边界条件问题

求出最后一层所有点的最小值,在遍历最后一层找出最小值

参考:http://blog.csdn.net/zhanghaodx082/article/details/24599479

 1 public class Solution { 2     public int minimumTotal(List<List<Integer>> triangle) { 3         if(null == triangle) 4             return 0; 5         if(1 == triangle.size()) 6             return triangle.get(0).get(0); 7         int miniPath[][] = new int[triangle.size()][triangle.size()]; 8         for(int i = 0; i < triangle.size(); i++){ 9             for(int j = 0; j < triangle.get(i).size(); j++){10                 if(0 == i && 0 == j){11                     miniPath[i][j] = triangle.get(0).get(0);12                     continue;13                 }                    14                 if(j == 0)15                     miniPath[i][j] = miniPath[i - 1][j] + triangle.get(i).get(j);16                 else if(j == i)17                     miniPath[i][j] = miniPath[i - 1][j - 1] + triangle.get(i).get(j);18                 else19                     miniPath[i][j] = Math.min(miniPath[i - 1][j], miniPath[i - 1][j - 1]) + triangle.get(i).get(j);20             }21         }22         int ret = miniPath[triangle.size() - 1][0];23         //showMiniPath(miniPath);24         for(int i = 1; i < miniPath[0].length; i++){25             ret = Math.min(ret, miniPath[triangle.size() - 1][i]);26         }27         return ret;28     }29 }

这里可以用原来的空间,使得空间复杂度为O(1)

ps:我没有这么做

Triangle