其他分享
首页 > 其他分享> > 265,三角形最小路径和

265,三角形最小路径和

作者:互联网

给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。

例如,给定三角形:

[

     [2],

    [3,4],

   [6,5,7],

  [4,1,8,3]

]

自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。

说明:

如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。

答案:

 1public int minimumTotal1(List<List<Integer>> triangle) {
2    if (triangle.size() == 0)
3        return 0;
4    for (int i = triangle.size() - 2; i >= 0; i--) {
5        for (int j = 0; j <= i; j++) {
6            List<Integer> nextRow = triangle.get(i + 1);
7            int sum = Math.min(nextRow.get(j), nextRow.get(j + 1)) + triangle.get(i).get(j);
8            triangle.get(i).set(j, sum);
9        }
10    }
11    return triangle.get(0).get(0);
12}

解析:

代码不是很难,他是从下往上找,比如上面的三角形,他首先计算的是6那个位置的值,因为他下面一个4和1,所以他取下面最小的和自己相加然后保存在6的那个位置,同理每一个都是这样计算,所以最终最顶端的数字就是最小的路径和。我们还可以申请一个变量来保存每行计算的值,代码如下

1public int minimumTotal(List<List<Integer>> triangle) {
2    int[] A = new int[triangle.size() + 1];
3    for (int i = triangle.size() - 1; i >= 0; i--) {
4        for (int j = 0; j < triangle.get(i).size(); j++) {
5            A[j] = Math.min(A[j], A[j + 1]) + triangle.get(i).get(j);
6        }
7    }
8    return A[0];
9}

当然这种解法也能实现,那我们能不能使用递归的方法来解决呢,当然可以,看下代码。

 1public int minimumTotal(List<List<Integer>> triangle) {
2    return minimumTotal(triangle, 0, 0, triangle.size());
3}
4
5public int minimumTotal(List<List<Integer>> triangle, int line, int row, int total) {
6    if (line >= total || row >= total)
7        return 0;
8    int left = minimumTotal(triangle, line + 1, row, total);
9    int right = minimumTotal(triangle, line + 1, row + 1, total);
10    return triangle.get(line).get(row) + (left < right ? left : right);
11}

这种虽然也能解决,但效率很低,因为他需要不断的重复计算,其实我们完全可以把每次计算的结果存起来,下次用的时候如果有就直接使用即可。看下代码

 1public int minimumTotal(List<List<Integer>> triangle) {
2    return minimumTotal(triangle, 0, 0, triangle.size(), new HashMap());
3}
4
5public int minimumTotal(List<List<Integer>> triangle, int line, int row, int total, Map<String, Integer> map) {
6    if (line >= total || row >= total)
7        return 0;
8    String key = line + "-" + row;
9    int sum;
10    if ((sum = map.getOrDefault(key, 0)) != 0)
11        return sum;
12    int left = minimumTotal(triangle, line + 1, row, total, map);
13    int right = minimumTotal(triangle, line + 1, row + 1, total, map);
14    sum = triangle.get(line).get(row) + (left < right ? left : right);
15    map.put(key, sum);
16    return sum;
17

标签:triangle,minimumTotal,get,int,路径,265,三角形,line,row
来源: https://blog.51cto.com/u_4774266/2902473