Leetcode 三角形最小路径和

server/2024/12/22 8:59:49/

在这里插入图片描述

算法思想与代码详解

这段代码采用的是**动态规划(Dynamic Programming)**的思想,用来解决“120. 三角形最小路径和”问题。动态规划通过将问题分解成更小的子问题,并通过保存子问题的解来避免重复计算,从而提高效率。


算法核心思路
  1. 从底向上计算(Bottom-Up Approach)

    • 因为我们要求从顶点到底边的最小路径和,可以从底边开始,逐步向上计算每一层的最优解。
    • 每个位置的最小路径和,取决于当前值和下一层两个可能的相邻路径值中的较小者。
  2. 状态表示(DP数组)

    • 使用一个一维数组 dp 来保存“从当前层到底边的最小路径和”。
    • dp[j] 表示从当前层位置 j 到底边的最小路径和。
  3. 状态转移方程

    • 对于某一层的节点 triangle[i][j],它的最小路径和为:
      [
      dp[j] = \min(dp[j], dp[j + 1]) + triangle[i][j]
      ]
    • dp[j] 表示当前位置 j 往下的最小路径,dp[j+1] 表示下一个位置 j+1 往下的最小路径。
  4. 最终结果

    • 计算完成后,dp[0] 即为从三角形顶点到底边的最小路径和。

代码解读
public int minimumTotal(List<List<Integer>> triangle) {int n = triangle.size();  // 三角形的层数int[] dp = new int[n];    // 用一维数组保存动态规划结果// 初始化:将 dp 数组赋值为最后一层的值for (int i = 0; i < n; i++) {dp[i] = triangle.get(n - 1).get(i);}// 从倒数第二层开始,向上计算每层的最小路径和for (int i = n - 2; i >= 0; i--) {for (int j = 0; j <= i; j++) {// 动态规划状态转移:当前点的最小路径和dp[j] = Math.min(dp[j], dp[j + 1]) + triangle.get(i).get(j);}}// 最终答案存储在 dp[0]return dp[0];
}

运行流程

以输入 triangle = [[2], [3, 4], [6, 5, 7], [4, 1, 8, 3]] 为例:

  1. 初始化

    • 将最后一层 [4, 1, 8, 3] 赋值到 dp 数组中:
      [
      dp = [4, 1, 8, 3]
      ]
  2. 从倒数第二层开始计算

    • 第 3 层 ([6, 5, 7]):

      • ( dp[0] = \min(4, 1) + 6 = 7 )
      • ( dp[1] = \min(1, 8) + 5 = 6 )
      • ( dp[2] = \min(8, 3) + 7 = 10 )
        更新后:
        [
        dp = [7, 6, 10, 3]
        ]
    • 第 2 层 ([3, 4]):

      • ( dp[0] = \min(7, 6) + 3 = 9 )
      • ( dp[1] = \min(6, 10) + 4 = 10 )
        更新后:
        [
        dp = [9, 10, 10, 3]
        ]
    • 第 1 层 ([2]):

      • ( dp[0] = \min(9, 10) + 2 = 11 )
        更新后:
        [
        dp = [11, 10, 10, 3]
        ]
  3. 最终结果

    • 返回 dp[0],即最小路径和为 11

时间和空间复杂度
  1. 时间复杂度

    • 外层循环从底层到顶层,共 (n-1) 次。
    • 内层循环每层最多运行 (i+1) 次,整体为 (O(n^2))。
    • 总时间复杂度: (O(n^2))。
  2. 空间复杂度

    • 使用了一个一维数组 dp,大小为 (n)。
    • 总空间复杂度: (O(n))。

总结

这段代码通过动态规划的思想,从底向上逐层计算路径和,用一个一维数组优化了空间开销,避免了重复计算,具有较高的效率,适用于求解此类逐层递归累加的问题。

java 实现

class Solution {public int minimumTotal(List<List<Integer>> triangle) {int n = triangle.size();int[] dp = new int[n];for(int i = 0; i < n; i++) {dp[i] = triangle.get(n - 1).get(i);}for(int i = n - 2; i >= 0; i--) { // i 自底向上for(int j = 0; j <= i; j++) { // j 对当前行从左到右遍历, 当 j == i 时,该行的dp[i]值得以确定dp[j] = Math.min(dp[j], dp[j + 1]) + triangle.get(i).get(j);}}return dp[0];}
}

http://www.ppmy.cn/server/152189.html

相关文章

shiny数字输入框

在 Shiny 应用中&#xff0c;可以使用 numericInput 函数来创建一个数字输入框。numericInput 函数允许用户输入一个数值&#xff0c;并提供了多种选项来定制输入框的外观和行为。 在 Shiny 应用中使用 numericInput&#xff1f; 创建一个新的 Shiny 应用文件夹&#xff0c;并…

网络视频监控平台/安防监控/视频综合管理Liveweb视频汇聚平台解决方案

一、当前现状分析 当前视频资源面临以下问题&#xff1a; 1&#xff09;不同单位在视频平台建设中以所属领域为单位&#xff0c;设备品牌众多&#xff0c;存在的标准不一&#xff0c;各系统之间也没有统一标准&#xff1b; 2&#xff09;各单位视频平台建设分散、统筹性差&am…

Vue+element 回车查询页面刷新

问题描述&#xff1a; form 表单出查询条件需要实现 input 输入完成后键盘回车查询&#xff1a;keyup.enter“handleQuery”&#xff0c;如果 form 里只有一个input&#xff0c;回车没有触发事件&#xff0c;而是刷新页面&#xff0c;放两个input就没问题 问题原因&#xff1…

HarmonyOS(72)事件拦截处理详解

事件拦截 1、参考资料2、HitTestMode3、onTouchIntercept、onTouch、onClick事件执行顺序3.1、系统默认事件传递顺序3.2、子组件拦截事件1、参考资料 HarmonyOS(71) 自定义事件分发之TouchTestStrategy使用说明HarmonyOS(70) ArkUI 事件分发拦截,事件冲突解决方案HitTestModea…

【C++】sophus : sim3.hpp 描述了在 3D 空间中的缩放、旋转和平移 (十九)

sim3.hpp 文件定义了与 Sim(3) 群相关的类和操作。Sim(3) 群描述了在 3D 空间中的缩放、旋转和平移。以下是对该文件主要内容的总结&#xff1a; 主要类和命名空间 命名空间 Sophus Sophus 命名空间包含了与 Sim(3) 群相关的所有类和函数定义。 类模板 Sim3Base Sim3Base 是一个…

Redis初(一)---服务端高并发分布式结构演进

1、常见概念 1.1、应用(Application) / 系统(System) 为了完成一套服务的一个/一组相互配合的程序群。 ⽣活例⼦类⽐:为了完成⼀项任 务,⽽搭建的由⼀个⼈或者⼀群相互配的⼈组成的团队。 1.2、模块(Module) / 组件(Component) 一个应用里面有很多个功能,每个独立…

Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别

MyBatis 是一个用于简化数据库操作的框架&#xff0c;它可以帮助开发人员通过映射语句轻松执行 SQL 查询&#xff0c;并且能够方便地实现对象与数据库表之间的映射。MyBatis 支持一对一、一对多和多对多等关联查询。下面我们来探讨一下 MyBatis 如何实现一对一、一对多的关联查…

1. petalinux 加载硬件描述文件(hdf/xsa)失败

报错信息 kemaoTP340:~/zynq/test$ petalinux-config --get-hw-description ../hardware/ INFO: Sourcing build tools INFO: Getting hardware description... [INFO] Generating Kconfig for project ERROR: Failed to generate /home/kemao/zynq/test/build/misc/config/Kc…