前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 0120. 三角形最小路径和[动态规划详解]

LeetCode 0120. 三角形最小路径和[动态规划详解]

原创
作者头像
Yano_nankai
修改2021-03-22 10:32:15
2990
修改2021-03-22 10:32:15
举报
文章被收录于专栏:二进制文集二进制文集

题目描述

题目链接

给定一个三角形 triangle ,找出自顶向下的最小路径和。

每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。

示例 1:

代码语言:txt
复制
输入:triangle = [[2],[3,4],[6,5,7],[4,1,8,3]]
输出:11
解释:如下面简图所示:
   2
  3 4
 6 5 7
4 1 8 3
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。

示例 2:

代码语言:txt
复制
输入:triangle = [[-10]]
输出:-10

进阶:

代码语言:txt
复制
你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题吗?

解题思路

这道题和二叉树的节点路径和是一样的,只不过这道题是数组的形式。核心思想就是记录从根节点到每个子节点的最小和,然后在最后一行中找最小值即可。

代码

代码语言:txt
复制
class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {
        List<Integer> pre = triangle.get(0);
        for (int i = 1; i < triangle.size(); i++) {
            List<Integer> now = triangle.get(i);
            List<Integer> ans = new ArrayList<>();
            for (int j = 0; j < now.size(); j++) {
                if (j == 0) {
                    ans.add(now.get(j) + pre.get(0));
                } else if (j == now.size() - 1) {
                    ans.add(now.get(j) + pre.get(j - 1));
                } else {
                    ans.add(now.get(j) + Math.min(pre.get(j), pre.get(j - 1)));
                }
            }
            pre = new ArrayList(ans);
            ans.clear();
        }
        return Collections.min(pre);
    }
}

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

GitHub LeetCode 项目

项目 GitHub LeetCode 全解,欢迎大家 star、fork、merge,共同打造最全 LeetCode 题解!

Java 编程思想-最全思维导图-GitHub 下载链接,需要的小伙伴可以自取~!!!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
  • 解题思路
  • 代码
  • 复杂度分析
  • GitHub LeetCode 项目
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档