LeetCode120——三角形最小路径和

我的LeetCode代码仓:https://github.com/617076674/LeetCode

原题链接:https://leetcode-cn.com/problems/triangle/description/

题目描述:

知识点:递归动态规划

思路一:递归实现

从第一层开始,递归地求解第n层的最小路径和。

时间复杂度和空间复杂度均是O(n ^ 2)。

JAVA代码:

public class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {
        List<Integer> list = new ArrayList<>();
        list.add(triangle.get(0).get(0));

        List<Integer> lastList = generateNextSum(list, 1, triangle);
        int minIndex = 0;
        for (int i = 0; i < lastList.size(); i++) {
            if(lastList.get(i) < lastList.get(minIndex)) {
                minIndex = i;
            }
        }
        return lastList.get(minIndex);
    }

    /*
     * 生成第n层的和,list中记录着第n - 1层的和
     */
    private List<Integer> generateNextSum(List<Integer> list, int n, List<List<Integer>> triangle) {
        if(n == triangle.size()) {
            return list;
        }
        List<Integer> retList = new ArrayList<>();
        for (int j = 0; j < triangle.get(n).size(); j++) {
            if(j == 0) {
                retList.add(list.get(0) + triangle.get(n).get(0));
            }
            if(j > 0 && j < triangle.get(n).size() - 1) {
                retList.add(Math.min(list.get(j - 1), list.get(j)) + triangle.get(n).get(j));
            }
            if(j == triangle.get(n).size() - 1) {
                retList.add(list.get(list.size() - 1) + triangle.get(n).get(triangle.get(n).size() - 1));
            }
        }
        return generateNextSum(retList, n + 1, triangle);
    }
}

LeetCode解题报告:

思路二:动态规划

对于每一层的最小路径和,只和当前层的数值以及前一层的最小路径和有关。我们只需一个list1记录前一层的最小路径和,另一个list2根据list1和当前层的数值计算当前层的最短路径和即可。

时间复杂度是O(n ^ 2)。空间复杂度是O(n)。

JAVA代码:

public class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {
        List<Integer> list1 = triangle.get(0);
        if(triangle.size() == 1){
            int minIndex = 0;
            for(int i = 1; i < list1.size(); i++){
                if(list1.get(i) < list1.get(minIndex)){
                    minIndex = i;
                }
            }
            return list1.get(minIndex);
        }
        List<Integer> list2 = new ArrayList<>();
        for(int i = 0; i < triangle.size() - 1; i++){
            list2.clear();
            list2.add(list1.get(0) + triangle.get(i + 1).get(0));
            for(int j = 1; j < triangle.get(i + 1).size() - 1; j++){
                list2.add(Math.min(list1.get(j - 1), list1.get(j)) + triangle.get(i + 1).get(j));
            }
            list2.add(list1.get(list1.size() - 1) + triangle.get(i + 1).get(triangle.get(i + 1).size() - 1));
            list1.clear();
            list1.addAll(list2);
        }
        int minIndex = 0;
        for(int i = 1; i < list2.size(); i++){
            if(list2.get(i) < list2.get(minIndex)){
                minIndex = i;
            }
        }
        return list2.get(minIndex);
    }
}

LeetCode解题报告:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值