1. 程式人生 > 其它 >120. 三角形最小路徑和

120. 三角形最小路徑和

三種解法:dfs到記憶化遞迴再到動態規劃
dfs(超時):

class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {
       return dfs(triangle,0,0);
    }
    int dfs(List<List<Integer>> triangle,int pos,int x){
        if(pos==triangle.size()||x==triangle.get(pos).size())return 0;
       
       int a= dfs(triangle,pos+1,x);

       
        int  b= dfs(triangle,pos+1,x+1);
       return triangle.get(pos).get(x)+Math.min(a,b);

    }
}

記憶化遞迴:

class Solution {
    
   
    HashMap<String,Integer> map=new HashMap<>();
    public int minimumTotal(List<List<Integer>> triangle) {
       
       return dfs(triangle,0,0);
    }
    int dfs(List<List<Integer>> triangle,int pos,int x){
        if(pos==triangle.size()||x==triangle.get(pos).size())return 0;
        
        int a=0;
        int b=0;
        String str1=new String((pos+1)+"+"+x);
        if(map.containsKey(str1))
            a=map.get(str1);
        else
           a= dfs(triangle,pos+1,x);

        String str2=new String((pos+1)+"+"+(x+1));
        if(map.containsKey(str2))
            b=map.get(str2);
        else
            b= dfs(triangle,pos+1,x+1);
        
        int num=triangle.get(pos).get(x)+Math.min(a,b);
        
        map.put(pos+"+"+x,num);

        return num;

    }
}

動態規劃:

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

           }
       }
       return dp[0];

    }
}