100220. 相同分数的最大操作数目 II

简介: 100220. 相同分数的最大操作数目 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

解题思路

直接深搜3种取值的操作次数:

  • 选择 nums 中最前面两个元素并且删除它们。
dfs(nums[0] + nums[1], 2, nums.length - 1);
  • 选择 nums 中最后两个元素并且删除它们。
dfs(nums[0] + nums[nums.length - 1], 1, nums.length - 2);
  • 选择 nums 中第一个和最后一个元素并且删除它们。
dfs(nums[nums.length - 1] + nums[nums.length - 2], 0, nums.length - 3);

深搜过程中也分别计算不同取值的最大操作次数

const dfs = (sum, left, right, cnt = 1) => {
  if (map[left + "-" + right]) return 0;
  if (left >= right) return cnt;
  let t1 = (t2 = t3 = 0);
  if (nums[left] + nums[left + 1] === sum)
    t1 = dfs(sum, left + 2, right, cnt + 1);
  if (nums[left] + nums[right] === sum)
    t2 = dfs(sum, left + 1, right - 1, cnt + 1);
  if (nums[right] + nums[right - 1] === sum)
    t3 = dfs(sum, left, right - 2, cnt + 1);
  cnt = Math.max(t1, t2, t3, cnt);
  map[left + "-" + right] = true;
  maxCnt = Math.max(maxCnt, cnt);
  return cnt;
};
  • 快速处理元素相同的数组

如果数组中的所有元素都是相同的话,那么他的最大操作次数为:Math.floor(sortNums.length / 2)

const sortNums = [...nums].sort((a, b) => a - b);
if (sortNums[0] === sortNums[sortNums.length - 1])
  return Math.floor(sortNums.length / 2);

AC代码

/**
 * @param {number[]} nums
 * @return {number}
 */
var maxOperations = function (nums) {
  const map = {};
  let maxCnt = 1;
  const dfs = (sum, left, right, cnt = 1) => {
    if (map[left + "-" + right]) return 0;
    if (left >= right) return cnt;
    let t1 = (t2 = t3 = 0);
    if (nums[left] + nums[left + 1] === sum)
      t1 = dfs(sum, left + 2, right, cnt + 1);
    if (nums[left] + nums[right] === sum)
      t2 = dfs(sum, left + 1, right - 1, cnt + 1);
    if (nums[right] + nums[right - 1] === sum)
      t3 = dfs(sum, left, right - 2, cnt + 1);
    cnt = Math.max(t1, t2, t3, cnt);
    map[left + "-" + right] = true;
    maxCnt = Math.max(maxCnt, cnt);
    return cnt;
  };
  const sortNums = [...nums].sort((a, b) => a - b);
  if (sortNums[0] === sortNums[sortNums.length - 1])
    return Math.floor(sortNums.length / 2);
  dfs(nums[0] + nums[1], 2, nums.length - 1);
  dfs(nums[0] + nums[nums.length - 1], 1, nums.length - 2);
  dfs(nums[nums.length - 1] + nums[nums.length - 2], 0, nums.length - 3);
  return maxCnt;
};

公众号

关注公众号『前端也能这么有趣』,获取更多有趣内容。

说在后面

🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『前端也能这么有趣』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。

目录
相关文章
|
JavaScript
vue3- antd design vue 引入iconfont
vue3- antd design vue 引入iconfont
|
存储 机器学习/深度学习 物联网
基于重要性加权的LLM自我改进:考虑分布偏移的新框架
本文提出一种新的大型语言模型(LLM)自我改进框架——基于重要性加权的自我改进(IWSI),旨在优化自动生成数据的质量。通过引入DS权重指标衡量数据的分布偏移程度(DSE),该方法不仅能确保答案正确性,还能过滤掉那些虽正确但分布上偏离较大的样本,以提升自我训练的效果。IWSI使用一个小的有效数据集来估算每个自生成样本的DS权重,并据此进行筛选。实验结果显示,相比于仅依赖答案正确性的传统方法,IWSI能更有效地提高LLM在多种任务上的表现。特别是在数学问题解答任务上,相较于基线方法,IWSI带来了显著的性能提升,证实了过滤高DSE样本的重要性及该方法的有效性。
333 0
基于重要性加权的LLM自我改进:考虑分布偏移的新框架
|
机器学习/深度学习 数据处理 调度
人像分割PaddlePaddle
人像分割PaddlePaddle
295 0
|
NoSQL Linux 编译器
详讲yum包管理器/Vim编辑器/gdb调试器的基础用法【Linux】
详讲yum包管理器/Vim编辑器/gdb调试器的基础用法【Linux】
203 0
|
数据处理
Matlab中数据处理和多项式插值与曲线拟合
一、  基本统计处理 1、查取最大值MAX函数的命令格式有:[Y,I]= max (X):将max(X)返回矩阵X的各列中的最大元素值及其该元素的位置赋予行向量Y与I;当X为向量时,则Y与I为单变量。
1755 0
|
消息中间件 存储 分布式计算
Flink Exactly-once 实现原理解析
这一课时我们将讲解 Flink “精确一次”的语义实现原理,同时这也是面试的必考点。Flink 的“精确一次”处理语义是,Flink 提供了一个强大的语义保证,也就是说在任何情况下都能保证数据对应用产生的效果只有一次,不会多也不会少。那么 Flink 是如何实现“端到端的精确一次处理”语义的呢?
1699 0
Flink Exactly-once 实现原理解析
|
域名解析 弹性计算 关系型数据库
阿里云服务器搭建网站流程(图文教程)
新手如何用阿里云服务器Linux系统安装宝塔面板搭建WordPress博客网站呢?WordPress作为全球实用最广泛的CMS系统,以功能强大、扩展性强,插件众多,易扩充功能等特点,受到全球站长开发者青睐。而阿里云作为国内用户量最多的云服务器商,因此,本文以阿里云为例,详细介绍云服务器Linux系统如何安装宝塔面板搭建WordPress博客网站。
|
机器学习/深度学习 存储 人工智能
达摩院自研向量检索引擎Proxima在行业搜索中的应用
淘宝搜索推荐、视频搜索背后使用了什么样的检索技术?非结构化数据检索,向量检索,以及多模态检索,它们到底解决了什么问题?今天由阿里达摩院的科学家从业务问题出发,抽丝剥茧,深度揭秘达摩院内部技术,向量检索引擎 Proxima,以及在阿里云开放搜索产品行业模板能力的实践应用~
2528 1
达摩院自研向量检索引擎Proxima在行业搜索中的应用
|
jenkins 持续交付 数据安全/隐私保护
jenkins配置第三方插件 gitee并且构建 python代码
jenkins配置第三方插件 gitee并且构建 python代码
|
机器学习/深度学习 人工智能 算法
英特尔AI医疗实战曝光:10倍加速辅助诊断、准确度高达90%
深耕医疗健康领域 20 年,医疗健康数字化、药物治疗精确化一直是英特尔的重要议题。
956 0
英特尔AI医疗实战曝光:10倍加速辅助诊断、准确度高达90%