首页 > 其他分享 >力扣每日一题 6/9

力扣每日一题 6/9

时间:2024-06-09 19:32:50浏览次数:28  
标签:nums 每日 len 戳破 力扣 区间 气球 dp

312.戳气球[困难]

题目:

有 n 个气球,编号为0 到 n - 1,每个气球上都标有一个数字,这些数字存在数组 nums 中。

现在要求你戳破所有的气球。戳破第 i 个气球,你可以获得 nums[i - 1] * nums[i] * nums[i + 1] 枚硬币。 这里的 i - 1 和 i + 1 代表和 i 相邻的两个气球的序号。如果 i - 1或 i + 1 超出了数组的边界,那么就当它是一个数字为 1 的气球。

求所能获得硬币的最大数量。

示例 1:

输入:nums = [3,1,5,8]
输出:167
解释:
nums = [3,1,5,8] --> [3,5,8] --> [3,8] --> [8] --> []
coins =  3*1*5    +   3*5*8   +  1*3*8  + 1*8*1 = 167

示例 2:

输入:nums = [1,5]
输出:10

提示:

  • n == nums.length
  • 1 <= n <= 300
  • 0 <= nums[i] <= 100

 题目分析:

        这道题需要用到数组和动态规划来解,数组用来储存遍历到的金币值,动态规划遍历最后一个被戳破的气球的下标,然后将其分为左右和自身两部分,计算出金币值与当前最大的金币值做比较。遍历完即可。

代码实现:

class Solution:
    def maxCoins(self, nums: List[int]) -> int:
        #nums首尾添加1,方便处理边界情况
        nums=[1]+nums+[1]
        dp = [[0]*(len(nums)) for i in range(len(nums))]
        def calc(i,j):
            m = 0 
            #k是(i,j)区间内最后一个被戳的气球
            for k in range(i+1,j): #k取值在(i,j)开区间中
                #以下都是开区间(i,k), (k,j)
                l = dp[i][k]
                r = dp[k][j]
                key = l+r+ nums[i]*nums[k]*nums[j]
                if key > m: m = key
            dp[i][j] = m  # 存储到dp中

        #对每一个区间长度进行循环
        for n in range(2,len(nums)): #区间长度的初始位置
            #开区间长度会从3一直到len(nums)
            #对于每一个区间长度,循环区间开头的i
            for i in range(0,len(nums)-n): #i+n = len(nums)-1
                calc(i,i+n)
        return dp[0][len(nums)-1]

总结: 

        这道题考到了动态规划,但是动态规划是我的弱项,对于解出这道题来说还是远远不够的,所以又看了题解才磨出来了这道题。这个动态规划的解决方案的关键在于,我们通过递归地计算每个子问题的最优解,来构建整个问题的最优解。每次我们选择一个气球作为最后一个被戳破的气球,并将其乘积加到最优解上,然后递归地计算左右两边的子区间。通过这种方法,我们能够得到全局的最优解。

        我们定义了一个二维数组 dp,其中 dp[i][j] 表示在戳破气球 i 和 j 之间的所有气球(包括 i 和 j)后我们能得到的最大分数。注意这里的 i 和 j 指的是气球的下标,dp 数组的大小为 len(nums) x len(nums)

  calc 函数的作用是计算从 i 到 j 的区间内的最大分数,并将其存储在 dp[i][j] 中。函数内部通过遍历 (i+1, j) 区间内的所有可能的 k,来找到最后一个被戳破的气球 k。对于每个 k,我们计算 dp[i][k] 和 dp[k][j] 的和,再加上气球 ik 和 j 的分数乘积,然后更新 dp[i][j] 的最大值。

       最后,我们通过循环不同长度的区间来填充 dp 数组。对于每个区间长度 n,我们从区间开头 i 开始,计算区间 (i, i+n) 的最大分数。通过这种方式,我们最终得到了 dp[0][len(nums)-1] 的值,这是我们戳破所有气球后能得到的最大分数。

标签:nums,每日,len,戳破,力扣,区间,气球,dp
From: https://blog.csdn.net/Xxy_1008/article/details/139562438

相关文章

  • 力扣每日一题 6/8
    3040.相同分数的最大操作数目II[中等]题目:给你一个整数数组 nums ,如果 nums 至少 包含 2 个元素,你可以执行以下操作中的 任意 一个:选择 nums 中最前面两个元素并且删除它们。选择 nums 中最后两个元素并且删除它们。选择 nums 中第一个和最后一个元素并且删......
  • 力扣96 不同的二叉搜索树 Java版本
    文章目录题目描述代码题目描述给你一个整数n,求恰由n个节点组成且节点值从1到n互不相同的二叉搜索树有多少种?返回满足题意的二叉搜索树的种数。示例1:输入:n=3输出:5示例2:输入:n=1输出:1提示:1<=n<=19代码importjava.lang.annotation.Rete......
  • 每日一题(LeetCode · 35)搜索插入位置
    题目:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(logn) 的算法。示例1:输入:nums=[1,3,5,6],target=5输出:2示例 2:输入:nums=[1,3,5,6],target......
  • 【力扣】二叉树的最大深度
    给定一个二叉树root,返回其最大深度。二叉树的最大深度是指从根节点到最远叶子节点的最长路径上的节点数。示例1:输入:root=[3,9,20,null,null,15,7]输出:3示例2:输入:root=[1,null,2]输出:2层序遍历求深度流程层序遍历是对二叉树每一层进行遍历,我们定义一个......
  • 【力扣】对称二叉树
    给你一个二叉树的根节点root,检查它是否轴对称。示例1:输入:root=[1,2,2,3,4,4,3]输出:true示例2:输入:root=[1,2,2,null,3,null,3]输出:false队列层序遍历流程进行两次同步遍历,分别从根节点的左子树和右子树开始,然后比较每个节点的值代码实现classSolution......
  • 【力扣】翻转二叉树
    给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。示例1:输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例2:输入:root=[2,1,3]输出:[2,3,1]示例3:输入:root=[]输出:[]递归法流程把每一个节点的左右孩子互换,就实现了整体翻转的效果。使用递归......
  • 华为OD刷题C卷 - 每日刷题 16(连续字母长度,拼接URL)
    两段代码分别解决了两个不同的字符串处理问题,下面是对它们的概述:1、(连续字母长度):这段代码是解决“连续字母长度”的问题。它提供了一个Java类Main,其中包含main方法和getResult方法,用于找出给定字符串中,按相同字母的最长连续子串长度排序后的第k长的子串的长度。main方法......
  • 华为OD刷题C卷 - 每日刷题 17(字符串序列判定,最长的指定瑕疵度的元音子串)
    1、(字符串序列判定):这段代码是解决“字符串序列判定”的问题。它提供了一个Java类Main,其中包含main方法和getResult方法,用于判断字符串S是否是字符串L的有效子串。main方法首先读取两个字符串S和L,然后调用getResult方法并打印最后一个有效字符在L中的位置。getResult方法......
  • 华为OD刷题C卷 - 每日刷题 13(图像物体的边界,英文输入法)
    1、(图像物体的边界):这段代码是解决“图像物体的边界”的问题。它提供了一个Java类Main,其中包含main方法和getResult方法,以及一个内部UnionFindSet类,用于计算像素1代表的物体的边界个数。main方法首先读取二维数组的行数m和列数n,然后读取二维数组matrix中的像素值。接着,调用......
  • 华为OD刷题C卷 - 每日刷题 8(整形数组按个位值排序,停车场车辆统计)
    两段代码分别解决了两个不同的算法问题,下面是对它们的概述:1、(整形数组按个位值排序):这段代码是解决“整形数组按个位值排序”的问题。它提供了一个Java类Main,其中包含main方法,用于读取输入、执行排序并打印结果。代码首先使用Scanner从标准输入读取一行文本,该文本包含一个......