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                 else
19                     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:我没有这么做

posted on 2014-11-20 00:02  luckygxf  阅读(214)  评论(0编辑  收藏  举报

导航