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

【Java每日一题】2.和数最大操作II-动态规划

题目难度:中等

主要提升:for循环思想、动态规划思想、数组操作

一、题目描述:

给你一个整数数组 nums ,如果 nums 至少包含 2 个元素,你可以执行以下操作中的任意一个
(1)选择 nums 中最前面两个元素并且删除它们。
(2)选择 nums 中最后两个元素并且删除它们。
(3)选择 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 次操作。

三、思路:

要使用动态规划的思想,对于三种情况分别进行计算,返回最优解为最大次数。

四、代码:

参考Leetcode:

class Solution {int[] nums;int[][] memo;public int maxOperations(int[] nums) {// 初始化变量int n = nums.length; // 获取输入数组的长度this.nums = nums; // 将输入数组赋值给类的成员变量this.memo = new int[n][n]; // 创建一个二维数组用于记忆化搜索int res = 0; // 初始化结果变量为0// 尝试三种不同的操作并取最大值res = Math.max(res, helper(0, n - 1, nums[0] + nums[n - 1]));res = Math.max(res, helper(0, n - 1, nums[0] + nums[1]));res = Math.max(res, helper(0, n - 1, nums[n - 2] + nums[n - 1]));return res; // 返回最终结果}public int helper(int i, int j, int target) {// 重置记忆化数组for (int k = 0; k < nums.length; k++) {Arrays.fill(memo[k], -1);}// 调用深度优先搜索函数return dfs(i, j, target);}public int dfs(int i, int j, int target) {// 递归终止条件if (i >= j) {return 0;}// 如果已经计算过这个子问题,直接返回记忆化的结果if (memo[i][j] != -1) {return memo[i][j];}// 初始化答案为0int ans = 0;// 检查三种可能的操作if (nums[i] + nums[i + 1] == target) {ans = Math.max(ans, dfs(i + 2, j, target) + 1);}if (nums[j - 1] + nums[j] == target) {ans = Math.max(ans, dfs(i, j - 2, target) + 1);}if (nums[i] + nums[j] == target) {ans = Math.max(ans, dfs(i + 1, j - 1, target) + 1);}// 记忆化当前的结果memo[i][j] = ans;// 返回答案return ans;}
}

相关文章:

  • 顶级域名和二级域名的区别
  • SOA设计的标准要求
  • SAP HCM HR_PAD_HIRE_EMPLOYEE 自定义信息类型字段保存问题
  • 标题:深入探索Linux中的`ausyscall`
  • SpringCloud整合OpenFeign实现微服务间的通信
  • Visual Studio Code 怎么恢复默认布置
  • 计算机组成结构—IO方式
  • SpringCache和SpringTask
  • 【ARM64 常见汇编指令学习 19.2 -- ARM64 地址加载指令 ADR 详细介绍】
  • 高防CDN是如何应对DDoS和CC攻击的
  • 堆排序-调整算法
  • wireshark 标记自己想要的数据包
  • C++ OpenCV 图像分类魔法:探索神奇的模型与代码
  • 【上篇】从 YOLOv1 到 YOLOv8 的 YOLO 物体检测模型历史
  • 用git下载hugging face上的大模型,以Qwen1.5-7B为例
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 2017-08-04 前端日报
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • CSS居中完全指南——构建CSS居中决策树
  • Django 博客开发教程 8 - 博客文章详情页
  • Git的一些常用操作
  • MYSQL 的 IF 函数
  • select2 取值 遍历 设置默认值
  • spring cloud gateway 源码解析(4)跨域问题处理
  • vue的全局变量和全局拦截请求器
  • Webpack入门之遇到的那些坑,系列示例Demo
  • windows下mongoDB的环境配置
  • 安卓应用性能调试和优化经验分享
  • 百度小程序遇到的问题
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 前嗅ForeSpider中数据浏览界面介绍
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 阿里云API、SDK和CLI应用实践方案
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​Java并发新构件之Exchanger
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​Linux·i2c驱动架构​
  • # 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (06)金属布线——为半导体注入生命的连接
  • (52)只出现一次的数字III
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (回溯) LeetCode 78. 子集
  • (三)终结任务
  • (十三)MipMap
  • (一)kafka实战——kafka源码编译启动
  • (转)jQuery 基础
  • (转)关于如何学好游戏3D引擎编程的一些经验