首页 > 其他分享 >力扣-120. 三角形最小路径和

力扣-120. 三角形最小路径和

时间:2023-10-15 18:32:21浏览次数:35  
标签:120 结点 triangle int List 力扣 input 三角形 下标

题目描述

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

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

示例 1:

输入: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:

输入:triangle = [[-10]]
输出:-10

提示:

  • 1 <= triangle.length <= 200
  • triangle[0].length == 1
  • triangle[i].length == triangle[i - 1].length + 1
  • -104 <= triangle[i][j] <= 104

进阶:

你可以只使用O(n)的额外空间(n为三角形的总行数)来解决这个问题吗?

解题思路

解题标签:动态规划 记忆化搜索 递归

解决这道题其实可以借鉴递归版本的斐波那契数列代码,使用递归函数,我们只需要关注当前走到哪一步,下面的步骤交给递归函数来解决,当然得注意临界条件。 每次递归调用时分别计算当前节点(i, j)下一层(i+1, j)(i+1, j+1)两个节点的最短路径,最后比较一下,返回最小值,同时存入容器。 此外,题目规定要使用O(n)的时间复杂度,可以通过记忆化搜索来解决。所谓记忆化搜索就是为防止重复计算,把每次计算好的结果存到某个容器中,这样如果再遇到需要重复计算的时候直接从容器中拿结果,时间更快。

力扣-120. 三角形最小路径和_结点

例如当走到3这个节点时,需要递归计算下一层6和5,当走到4这个节点时,需要计算下一层5和7,这样一来5节点就重复计算了两次。因此,如果把计算好的结果存入某个容器中,再用到的时候直接取出来可以极大地提高运行速度。而且递归调用需要频繁的出栈入栈,也非常耗时间,使用记忆化搜索可以有效提升运行速度。

AC代码

public class T120 {

    // 存储计算结果
    private Map<String, Integer> results = new HashMap<>();

    public int minimumTotal(List<List<Integer>> triangle) {
        return cal(triangle, 0, 0);
    }

    private int cal(List<List<Integer>> triangle, int index, int column) {

        // 临界条件
        if (triangle.size() <= index) {
            return 0;
        }

        int currentValue = triangle.get(index).get(column);

        if (index == (triangle.size() - 1)) {
            return currentValue;
        }

        int a = 0;
        int b = 0;

        // 判断是否已经计算过
        if (!results.containsKey((index + 1) + ":" + column)) {
            // 递归调用(index+1, column)
            a = currentValue + cal(triangle, index + 1, column);
        } else {
            a = currentValue + results.get((index + 1) + ":" + column);
        }
        // 判断是否已经计算过
        if (!results.containsKey((index + 1) + ":" + (column+1))) {
            // 递归调用(index+1, column)
            b = currentValue + cal(triangle, index + 1, column + 1);
        } else {
            b = currentValue + results.get((index + 1) + ":" + (column+1));
        }
        // 比较,取最小值
        if (a <= b) {
            // 存入容器
            results.put(index + ":" + column, a);
            return a;
        } else {
            results.put(index + ":" + column, b);
            return b;
        }
    }

    @Test
    public void test27() {

        List<Integer> l1 = Arrays.asList(2);
        List<Integer> l2 = Arrays.asList(3, 4);
        List<Integer> l3 = Arrays.asList(6, 5, 7);
        List<Integer> l4 = Arrays.asList(4, 1, 8, 3);
        List<List<Integer>> input = new ArrayList<>();
        input.add(l1);
        input.add(l2);
        input.add(l3);
        input.add(l4);
        int ret = minimumTotal(input);
        System.out.println(ret);
    }
}

总结

第一次接触动态规划相关题目说实话卡了快一天,不过最后还是AC了!

力扣-120. 三角形最小路径和_结点_02

力扣-120. 三角形最小路径和_List_03

其实官方有给示例代码,但是笔者比较菜,看的不是太明白,就按自己的思路解决的。 革命尚未成功,仍需努力!

标签:120,结点,triangle,int,List,力扣,input,三角形,下标
From: https://blog.51cto.com/u_12966357/7873042

相关文章

  • 力扣---137. 只出现一次的数字 II
    给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次。请你找出并返回那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。 示例1:输入:nums=[2,2,3,2]输出:3示例2:输入:nums=[0,1,0,1,0,1,99]......
  • CF1204D2 Kirk and a Binary String (hard version) 题解
    CF1204D2KirkandaBinaryString(hardversion)题解分析先来分析\(01\)串的最长不下降子序列。全是\(0\)显然是不下降的,如果中间出现一个\(1\),为了维护不下降的性质,后面就只能全是\(1\)。一句话概括一下,\(0\)后面能跟\(0,1\),\(1\)后面只能跟\(1\)。现在来分析这......
  • 二次函数与三角形面积最大值
    引入如图\((1)\),已知抛物线\(y=x^2-2x+c\)与\(x\)轴交\(A\),\(B\)两点,与\(y\)轴交于\(C\)点,抛物线的顶点为\(D\)点,点\(A\)的坐标为\((1,0)\)。\((1)\)求点\(D\)的坐标。\((2)\)若\(M\)为直线\(BC\)下方抛物线上一动点,当\(\bigtriangleupMCB\)面积最大......
  • 洛谷B2005 字符三角形(python)
    这题重点在如果输入print(a,a,a,a,a),逗号会使输出的时候五个字符之间有空格,应该用a+a+a+a+a。代码如下a=input();print(""+a)print(""+a+a+a)print(a+a+a+a+a) ......
  • 三角形最小路径和
    题目链接120.三角形最小路径和解题过程我觉得这道题已经可以当作如何优化动态规划的经典例题了,首先从路径上采用的是从上到下的方式,我是用了我自己能想出来的方法,也就是二维数组去解决的,接下来进行优化,将O(n2)的空间复杂度降低为O(n),使用2n的空间存储状态,接下来再次进行优化,......
  • P9120 [春季测试 2023] 密码锁
    第一个想法显然是二分答案,可以考虑二分\(C\)值后枚举每一个权值区间进行判定,时间复杂度为\(O(nk^2\min(a,nk)\loga)\)。这个已经有\(5\times(5+4+5)=70\)分了??写一下。好吧假假假,每个权值区间毙掉的每个位置的密码锁状态都不同,并不好直接处理。很好现在\(25\)分。可以设d......
  • 力扣19.删除链表的倒数第 N 个结点
    给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例1:输入:head=[1,2,3,4,5],n=2输出:[1,2,3,5] 示例2:输入:head=[1],n=1输出:[] 示例3:输入:head=[1,2],n=1输出:[1]  提示:链表中结点的数目为 sz1<=sz<=300<=N......
  • 力扣18:四数之和(双指针+剪枝)
    给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a],nums[b],nums[c],nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):0<=a,b,c,d <na、b、c 和 d 互不相同nums[a]+nums[b]......
  • 120.
    注意到,对应原序列上\(a_i\)的选取过程,实际上是要求我们决策,并且从上个选取的地方进行转移的一个等效。那么问题变成了能否删除掉\([l,r]\)区间的所有数。首先一个必要条件即\(2\midlen\)并且,区间无严格众数,否则的话,即使我们每一步都能匹配成功,也只能匹配掉\(\lfloor{\d......
  • 12_打印三角形
    一.打印三角1.图一#!/bin/bash#1#22#333#4444#55555#666666#7777777#88888888#999999999foriin$(seq9);dofor((j=1;j<=i;j++));doecho-n"$i"doneecho""done2.第二个图#!/bin/bash#|_#||......