Leetcode120 三角形最小路径


LeetCode 120. 三角形最小路径

? 原题链接

思路:思路是不可能有的,怎么会能有思路呢,不过给我答案我看了思路以后很快就能复写出来,而且感觉还好,,,,

仔细分析,他就是个需要用到动态规划的问题!!

而且是个典型的多决策问题、、、

我一开始纠结与他并不是无后效性的,后来看了答案发现,他真的是无后效性的。

2 3

5 7 8

2 8 7 9

不就是这样的三角形么,构建map使得map上的i行j列就表示 i j 的最短距离。

根据提上的限定条件,最左边和最右边都是唯一确定的,中间的有i-1 j 和i-1 j-1来确定。

class Solution {
    public int minimumTotal(List> triangle) {
        int n = triangle.size();
        int[][] map = new int[n][n];
        map[0][0] = triangle.get(0).get(0);
        
        for(int i = 1;i

? 后来可以考虑倒着走,而且在原来的列表里改代码。这样似乎更简洁,但是是get 和set 列表,速度会慢一些。。。。。。

class Solution {
    public int minimumTotal(List> triangle) {
      for(int i = triangle.size()-2;i>=0;i--){
          for(int j = 0;j<=i;j++){
triangle.get(i).set(j,triangle.get(i).get(j)+Math.min(triangle.get(i+1).get(j),triangle.get(i+1).get(j+1)))  ;
          }         
      }
      return triangle.get(0).get(0);
    }
    }

再后来 为了节省空间复杂度,我们把int[][]的结构变成了int []这样空间复杂度变成了O(n)

代码如下:

class Solution {
    public int minimumTotal(List> triangle) {
        int n = triangle.size();
    int[] map = new int[n];
    for(int i = 0;i=0;i--){
          for(int j = 0;j<=i;j++){
        map[j] = triangle.get(i).get(j)+Math.min(map[j],map[j+1]);          
          }         
      }
      return map[0];
    }
    }

中间迭代的部分我又马虎了,,,,,哎 断点调式了一个小时,折磨死我啦。下回能不能认真一点,,,,,,

虽然每次都有问题,但是所有问题都找出来了。。。。。。