[leetcode]120. Triangle
阿新 • • 發佈:2018-12-17
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