当前位置: 首页 > news >正文

力扣每日一题 6/8

3040.相同分数的最大操作数目 II[中等]

题目:

给你一个整数数组 nums ,如果 nums 至少 包含 2 个元素,你可以执行以下操作中的 任意 一个:

  • 选择 nums 中最前面两个元素并且删除它们。
  • 选择 nums 中最后两个元素并且删除它们。
  • 选择 nums 中第一个和最后一个元素并且删除它们。

一次操作的 分数 是被删除元素的和。

在确保 所有操作分数相同 的前提下,请你求出 最多 能进行多少次操作。

请你返回按照上述要求 最多 可以进行的操作次数。

示例 1:

输入:nums = [3,2,1,2,3,4]
输出:3
解释:我们执行以下操作:
- 删除前两个元素,分数为 3 + 2 = 5 ,nums = [1,2,3,4] 。
- 删除第一个元素和最后一个元素,分数为 1 + 4 = 5 ,nums = [2,3] 。
- 删除第一个元素和最后一个元素,分数为 2 + 3 = 5 ,nums = [] 。
由于 nums 为空,我们无法继续进行任何操作。

示例 2:

输入:nums = [3,2,6,1,4]
输出:2
解释:我们执行以下操作:
- 删除前两个元素,分数为 3 + 2 = 5 ,nums = [6,1,4] 。
- 删除最后两个元素,分数为 1 + 4 = 5 ,nums = [6] 。
至多进行 2 次操作。

提示:

  • 2 <= nums.length <= 2000
  • 1 <= nums[i] <= 1000

题目分析:

 这道题的话数据量并不是很大,O(n**2)的复杂度就能过,根据题意分析呢,这道题可以用记忆化搜索来解答。主要思路就是dfs,确定一个初始值target,然后去遍历每个可以走的位置,取最大值。当我看到这道题的时候,有个大致思路但是难于代码实现,还是练的题少,于是查看了力扣大佬灵茶山艾府的解题思路,不得不承认确实写的很好,大致思路如下:

        定义 dfs(i,j)表示下标在闭区间 [i,j] 内的连续子数组,最多可以执行多少次操作。

        枚举三种操作方式,分别从 dfs(i+2,j)+1,dfs(i,j−2)+1,dfs(i+1,j−1)+1转移过来(如果能操作),取最大值,即为 dfs(i,j)。如果三种操作方式都不行,那么dfs(i,j)=0。

        递归终点:如果 i≥j,此时至多剩下一个数,无法操作,返回 0。

        递归入口:根据三种初始操作,分别为 dfs(2,n−1),dfs(0,n−3),dfs(1,n−2)。三者取最大值再加一(加上第一次操作),即为答案。

代码实现:

class Solution:def maxOperations(self, nums: List[int]) -> int:n = len(nums)@cachedef dfs(i, j, target):if i >= j:return 0ans = 0if nums[i] + nums[i + 1] == target:ans = max(ans, 1 + dfs(i + 2, j, target))if nums[i] + nums[j] == target:ans = max(ans, 1 + dfs(i + 1, j - 1, target))if nums[j - 1] + nums[j] == target:ans = max(ans, 1 + dfs(i , j - 2, target))return ansres = 0res = max(res, dfs(0, n - 1, nums[0] + nums[1]))res = max(res, dfs(0, n - 1, nums[0] + nums[n - 1]))res = max(res, dfs(0, n - 1, nums[n - 2] + nums[n - 1]))return res

总结:

        这段代码是一个用于求解在给定整数数组中,存在多少对数字之和为目标值的问题。函数 maxOperations 接受一个整数数组 nums 作为输入,然后定义了一个内部函数 dfs 用于递归求解满足条件的数字对数目。

        在 dfs 函数中,通过递归地考虑每一个数字与其他数字的组合情况,并更新最优解。最后在 maxOperations 函数中,通过调用 dfs 函数并传入不同的数对目标值,来求解满足条件的数字对的最大数量。

        总体来说,这段代码使用动态规划的思想来解决问题,通过记忆化搜索避免重复计算。

相关文章:

  • expect自动化交互应用程序工具
  • 【文件导出2】导出html文件数据
  • C# 绘图及古诗填字
  • Android基础-进程间通信
  • 熟悉的软件架构风格及详细介绍
  • 自动驾驶人工智能
  • 【深度学习】之 卷积(Convolution2D)、最大池化(Max Pooling)和 Dropout 的NumPy实现
  • arm系统中双网卡共存问题
  • 区块链共识机制技术一--POW(工作量证明)共识机制
  • Transformer论文精读
  • App UI 风格,引领时尚
  • 无头+单向+非循环链表的实现
  • web学习笔记(六十五)
  • Recognize Anything: A Strong Image Tagging Model(RAM模型使用方法)
  • 各品牌电视安装第三方软件失败的解决方法
  • Docker 笔记(2):Dockerfile
  • EOS是什么
  • fetch 从初识到应用
  • HomeBrew常规使用教程
  • JavaScript创建对象的四种方式
  • jdbc就是这么简单
  • pdf文件如何在线转换为jpg图片
  • 读懂package.json -- 依赖管理
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 诡异!React stopPropagation失灵
  • 聚类分析——Kmeans
  • 类orAPI - 收藏集 - 掘金
  • 聊聊sentinel的DegradeSlot
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 前端_面试
  • 前端临床手札——文件上传
  • 如何解决微信端直接跳WAP端
  • 探索 JS 中的模块化
  • 微信小程序:实现悬浮返回和分享按钮
  • 我的面试准备过程--容器(更新中)
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 在Unity中实现一个简单的消息管理器
  • 如何正确理解,内页权重高于首页?
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (4)事件处理——(7)简单事件(Simple events)
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (9)STL算法之逆转旋转
  • (Oracle)SQL优化基础(三):看懂执行计划顺序
  • (办公)springboot配置aop处理请求.
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (力扣题库)跳跃游戏II(c++)
  • (七)Knockout 创建自定义绑定
  • (实战篇)如何缓存数据
  • (四)库存超卖案例实战——优化redis分布式锁
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)