想法有了,但自己写折腾了好久,还是练的太少了,贴出来,有改进的地方希望提出来,大家共同学习~~
自顶向下:
```
public int minimumTotal(List<List<Integer>> triangle) {
int level = triangle.size();
return helper(triangle, 0, 0, level);
}
// 参数i表示当前层,level表示共有多少层
public int helper(List<List<Integer>> triangle, int i, int j, int level) {
if(i >= level || j >= triangle.get(i).size())
return 0;
int left = helper(triangle, i + 1, j, level);
int right = helper(triangle, i + 1, j + 1, level);
return Math.min(left, right) + triangle.get(i).get(j);
}
```
带备忘录的自顶向下:
```
public static int minimumTotal(List<List<Integer>> triangle) {
int level = triangle.size();
List<List<Integer>> memory = new ArrayList<>();
memory.add(new ArrayList<>());
return helper(triangle, 0, 0, level, memory);
}
// 参数i表示当前层,level表示共有多少层
public static int helper(List<List<Integer>> triangle, int i, int j, int level, List<List<Integer>> memory) {
if(i >= level || j >= triangle.get(i).size())
return 0;
// 到了最后一层,就将结果全部放入
if(i == level - 1 && memory.get(i).isEmpty()) {
for(int k = 0; k < triangle.get(i).size(); k++)
memory.get(i).add(triangle.get(i).get(k));
}
if(!memory.get(i).isEmpty() && j < memory.get(i).size() && memory.get(i).get(j) != null)
return memory.get(i).get(j);
if(memory.size() < level) // 防止添加回溯的过程又添加
memory.add(new ArrayList<>());
int left = helper(triangle, i + 1, j, level, memory);
int right = helper(triangle, i + 1, j + 1, level, memory);
memory.get(i).add(Math.min(left,right) + triangle.get(i).get(j));
return memory.get(i).get(j);
}
```
展开