120. 三角形最小路徑和
阿新 • • 發佈:2021-08-09
三種解法: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]; } }