1. 程式人生 > >[leetcode]120. Triangle

[leetcode]120. Triangle

Solution 1:遞迴超時了

class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {
        
        int i=0;
        int k=0;
        return help(i,k,triangle.size()-1,triangle);
    
    }
    
    public int help(int i,int k,int n,List<List<Integer>> triangle){
        
        if(i>n){
          return 0;
        } 
        
        int number=triangle.get(i).get(k);
       
        return  Math.min(help(i+1,k,n,triangle),help(i+1,k+1,n,triangle))+number;        
    }
}

Solution 2: bottom-up+memo

class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {
        
        int[][] memo=new int[triangle.size()+1][triangle.size()+1];
        for(int i=0;i<memo.length;i++){
            for(int j=0;j<memo[0].length;j++){
                memo[i][j]=-1;
            }
        }
        return help(0,0,triangle.size()-1,triangle,memo);
    
    }
    
    public int help(int i,int k,int n,List<List<Integer>> triangle,int[][] memo){
        
        if(i>n){
          return 0;
        } 
        
        if(memo[i][k]!=-1) return memo[i][k];
        
        int number=triangle.get(i).get(k);
        
        memo[i][k]= Math.min(help(i+1,k,n,triangle,memo),help(i+1,k+1,n,triangle,memo))+number;     
        
        return memo[i][k];
    }
}

Solution 3: 我怎麼總寫這種奇怪的dp

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

Solution 4: bottom up的dp

https://leetcode.com/problems/triangle/discuss/204210/Java-DP-Solution-beats-99.92-with-O(N)-space