方法1: dfs,can’t memo,cause tle。时间复杂2n,n为node数。空间复杂1.
class Solution {
List<List<Integer>> triangle;
int min = Integer.MAX_VALUE;
public int minimumTotal(List<List<Integer>> triangles) {
this.triangle = triangles;
int pathLen = 0;
dfs(0, 0, pathLen);
return min;
}
public void dfs(int i, int j, int pathLen){
if(i == triangle.size()){
min = Math.min(min, pathLen);
return;
}
if(i > triangle.size() || j >= triangle.get(i).size()) return;
pathLen += triangle.get(i).get(j);
dfs(i + 1, j, pathLen);
dfs(i + 1, j + 1, pathLen);
}
}
方法2: :改变方法1中的dfs返回值,使其返回当前最短路径值,这样我们就可以用memoization技术了。时间复杂n,空间复杂n。
class Solution {
List<List<Integer>> triangle;
Map<Pair<Integer, Integer>, Integer> map = new HashMap<>();
public int minimumTotal(List<List<Integer>> triangles) {
this.triangle = triangles;
return dfs(0, 0);
}
public int dfs(int i, int j){
if(map.containsKey(new Pair<>(i, j)))
return map.get(new Pair<>(i, j));
if(i >= triangle.size() || j >= triangle.get(i).size())
return 0;
int res = 0;
res = triangle.get(i).get(j) + Math.min(dfs(i+1, j), dfs(i+1, j+1));
map.put(new Pair<>(i, j), res);
return res;
}
}
方法3: dp。时间复杂n,空间复杂1。
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
for(int i = 1; i < triangle.size(); i++){
for(int j = 0; j < triangle.get(i).size(); j++){
int curr = triangle.get(i).get(j);
if(j - 1 >= 0 && j < triangle.get(i - 1).size()){
triangle.get(i).set(j, Math.min(curr + triangle.get(i - 1).get(j - 1), curr + triangle.get(i - 1).get(j)));
}else if(j - 1 >= 0) {
triangle.get(i).set(j, curr + triangle.get(i - 1).get(j - 1));
}else if(j < triangle.get(i - 1).size()){
triangle.get(i).set(j, curr + triangle.get(i - 1).get(j));
}
}
}
int res = Integer.MAX_VALUE;
for(int i = 0; i < triangle.get(triangle.size() - 1).size(); i++){
res = Math.min(res, triangle.get(triangle.size()-1).get(i));
}
return res;
}
}
总结:
- 无