3086. 拾起 K 个 1 需要的最少行动次数 Hard

给你一个下标从 0 开始的二进制数组 nums,其长度为 n ;另给你一个 正整数 k 以及一个 非负整数 maxChanges 。

Alice 在玩一个游戏,游戏的目标是让 Alice 使用 最少 数量的 行动 次数从 nums 中拾起 k 个 1 。游戏开始时,Alice 可以选择数组 [0, n - 1] 范围内的任何索引 aliceIndex 站立。如果 nums[aliceIndex] == 1 ,Alice 会拾起一个 1 ,并且 nums[aliceIndex] 变成0(这 不算 作一次行动)。之后,Alice 可以执行 任意数量 的 行动包括零次),在每次行动中 Alice 必须 恰好 执行以下动作之一:

 ·选择任意一个下标 j != aliceIndex 且满足 nums[j] == 0 ,然后将 nums[j] 设置为 1 。这个动作最多可以执行 maxChanges 次。

 ·选择任意两个相邻的下标 x 和 y|x - y| == 1)且满足 nums[x] == 1nums[y] == 0 ,然后交换它们的值(将 nums[y] = 1 和 nums[x] = 0)。如果 y == aliceIndex,在这次行动后 Alice 拾起一个 1 ,并且 nums[y] 变成 0 。

返回 Alice 拾起 恰好 k 个 1 所需的 最少 行动次数。

示例 1:

输入:nums = [1,1,0,0,0,1,1,0,0,1], k = 3, maxChanges = 1

输出:3

解释:如果游戏开始时 Alice 在 aliceIndex == 1 的位置上,按照以下步骤执行每个动作,他可以利用 3 次行动拾取 3 个 1 :

 ·游戏开始时 Alice 拾取了一个 1 ,nums[1] 变成了 0。此时 nums 变为 [1,1,1,0,0,1,1,0,0,1] 。

 ·选择 j == 2 并执行第一种类型的动作。nums 变为 [1,0,1,0,0,1,1,0,0,1]

 ·选择 x == 2 和 y == 1 ,并执行第二种类型的动作。nums 变为 [1,1,0,0,0,1,1,0,0,1] 。由于 y == aliceIndex,Alice 拾取了一个 1 ,nums 变为  [1,0,0,0,0,1,1,0,0,1] 。

 ·选择 x == 0 和 y == 1 ,并执行第二种类型的动作。nums 变为 [0,1,0,0,0,1,1,0,0,1] 。由于 y == aliceIndex,Alice 拾取了一个 1 ,nums 变为  [0,0,0,0,0,1,1,0,0,1] 。

请注意,Alice 也可能执行其他的 3 次行动序列达成拾取 3 个 1 。

示例 2:

输入:nums = [0,0,0,0], k = 2, maxChanges = 3

输出:4

解释:如果游戏开始时 Alice 在 aliceIndex == 0 的位置上,按照以下步骤执行每个动作,他可以利用 4 次行动拾取 2 个 1 :

 ·选择 j == 1 并执行第一种类型的动作。nums 变为 [0,1,0,0] 。

 ·选择 x == 1 和 y == 0 ,并执行第二种类型的动作。nums 变为 [1,0,0,0] 。由于 y == aliceIndex,Alice 拾起了一个 1 ,nums 变为 [0,0,0,0] 。

 ·再次选择 j == 1 并执行第一种类型的动作。nums 变为 [0,1,0,0] 。

 ·再次选择 x == 1 和 y == 0 ,并执行第二种类型的动作。nums 变为 [1,0,0,0] 。由于y == aliceIndex,Alice 拾起了一个 1 ,nums 变为 [0,0,0,0] 。

提示:

 ·2 <= n <= 105

 ·0 <= nums[i] <= 1

 ·1 <= k <= 105

 ·0 <= maxChanges <= 105

 ·maxChanges + sum(nums) >= k

题目大意:按照指定规则行动计算拾起k个1所需的最少行动次数。

分析:

(1)拾起1有三种情况:①在数组中otherIndex处的1需要|AliceIndex-otherIndex|次行动才能拾起;②手动生成Alice旁边的1需要2次行动才能拾起;

(2)由(1)可得,当Alice旁边没有1时,优先拾起手动生成的1。设Alice所在处和旁边处的1最多可以有count个,则当Alice旁边的1和maxChanges得到的1能够满足k个1时,即count+maxChanges>=k时,Alice先拾起旁边的1[需行动max(min(count,k)-1,0)次],再拾起手动生成的1(需行动(k-min(count,k))*2次),总共行动max(min(count,k)-1,0)+(k-min(count,k))*2次;当不能满足时,即count+maxChanges<k时,Alice先拾起数组中的k-maxChanges个1,再拾起手动生成的maxChanges个1,其中拾起手动生成的1需要2*maxChanges次行动;

(3)由(2)可知,本题的关键在于计算count+maxChanges<k时,Alice先拾起数组中的k-maxChanges个1所需的最少行动次数。由于从数组中需要拾起的1的个数是固定的,因此可以维护滑动窗口,使每个窗口内有k-maxChanges个1,从而计算在每个窗口中拾起这些1的最少行动次数即可;

(4)由(3)可知,本题的关键转换为如何计算拾起一个滑动窗口中k-maxChanges个1的最少行动次数。由于数组中0的存在使每个滑动窗口长度不一,因此可以将数组中的1都放在1个数组index中,其中index[i]表示第i+1个1在数组中的位置,然后在index数组中进行窗口滑动,就可以保证每个窗口的长度都相同。又因为在每个窗口中Alice站在窗口的中间位置时所需的行动次数最小,无论向左或向右都会使行动次数变大,所以还需维护每个窗口的中间位置mid,然后计算Alice站在mid时的最小行动次数,此行动次数即为当前窗口中拾起k-maxChanges个1的最少行动次数。

class Solution {
public:long long minimumMoves(vector<int>& nums, int k, int maxChanges) {int count=0;//count维护连续1的长度vector<int> index;for(int i=0;i<nums.size();++i){if(nums[i]){index.emplace_back(i);count=max(count,1);if(i>0&&nums[i]==nums[i-1]){count=max(count,2);if(i>1&&nums[i]==nums[i-2]) count=3;}}}count=min(count,k);if(k-count<=maxChanges) return (k-count)*2+max(count-1,0);int N=index.size(),rest=k-maxChanges;long long ans=LLONG_MAX,ans1,ans2,pos;vector<long long> sum(N+1,0);//sum[i]维护前i个1所在的位置和for(int i=0;i<N;++i) sum[i+1]=sum[i]+index[i];for(int l=0,r=rest,mid=rest/2;r<=N;++l,++r,++mid){pos=index[mid];ans1=(mid-l)*pos-(sum[mid]-sum[l]);ans2=sum[r]-sum[mid]-(r-mid)*pos;ans=min(ans,ans1+ans2);}return ans+2*maxChanges;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/40639.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM 堆内存结构 年轻代 老年代

堆内存 内存划分 对于大多数应用&#xff0c;Java 堆是 Java 虚拟机管理的内存中最大的一块&#xff0c;被所有线程共享。此内存区域的唯一目的就是存放对象实例&#xff0c;几乎所有的对象实例以及数据都在这里分配内存。 为了进行高效的垃圾回收&#xff0c;虚拟机把堆内存…

线程池的七大核心参数

今天了解到线程池的七大核心参数包括&#xff1a; 1. 核心线程数&#xff08;corePoolSize&#xff09;&#xff1a;线程池中能够同时执行的线程数量。 2. 最大线程数&#xff08;maximumPoolSize&#xff09;&#xff1a;线程池中允许的最大线程数量。 3. 线程空闲时间&#…

小白 | 华为云docker设置镜像加速器

一、操作场景 通过docker pull命令下载镜像中心的公有镜像时&#xff0c;往往会因为网络原因而需要很长时间&#xff0c;甚至可能因超时而下载失败。为此&#xff0c;容器镜像服务提供了镜像下载加速功能&#xff0c;帮助您获得更快的下载体验。 二、约束与限制 构建镜像的客…

6年铲屎官测评宠物空气净化器哪款好,热门养宠空气净化器排名

作为一名资深猫奴&#xff0c;发现很多铲屎官每到春秋换季就开始疯狂打喷嚏、突然开始全身过敏。其原因是猫毛一到换季就开始疯狂掉毛&#xff0c;相对于可见猫毛&#xff0c;漂浮在空气中的浮毛就是罪灰祸首。微小的浮毛在空气总容易被人体吸入体内&#xff0c;而浮毛上面附带…

【Python机器学习】模型评估与改进——在模型选择中使用评估指标

我们通常希望&#xff0c;在使用GridSearchCV或cross_val_score进行模型选择时能够使用AUC等指标。scikit-learn提供了一种非常简单的实现方法&#xff0c;那就是scoring参数&#xff0c;它可以同时用于GridSearchCV和cross_val_score。你只需要提供一个字符串&#xff0c;用于…

Appium自动化测试框架3

滑动与拖拽 swipe 滑动时间的长短会影响最后的结果的 是有一定误差的 from appium import webdriver import time # 启动一个字典 包装相应的启动参数 desired_caps dict() # 平台的名字&#xff0c;安卓还是IOS 大小写无所谓 desired_caps[platformName] Android # 平台的…

软考(高项)系统分析师--开篇

文章目录 前言一、学习过程&#xff1a;二、考试过程&#xff1a;总结: 前言 博客主在2024年05月22号参加了高项的系统分析师考试&#xff0c;在此进行一个经验总结以供小伙伴参考,如果想参考博客主学习资料的可以在下方留言进行交流。 一、学习过程&#xff1a; 先说下时间&…

2.5 C#视觉程序开发实例1----设计一个IO_Manager

2.5 C#视觉程序开发实例1----设计一个IO_Manager 第一步目标&#xff1a; 1 实现获取IO触发信号Trig0 2 能够实现程序切换 3 图像处理后能够输出一个脉冲 1 IO 引脚定义 1.1 输入信号定义 1.2 输出信号定义 2 IO时序图 2.1 触发时序 2.2 切换程序时序图 3 IO_Manager.cs …

半实物仿真测试系统

设备组成 test系统主要由硬件部分与软件部分组成。硬件部分由PCI机箱、PCI控制器以及各种PCI接口板卡组成。软件部分由测试设计软件模块、测试执行服务软件模块、测试执行客户端软件模块、设备资源管理软件模块等主要软件模块以及曲线数据生成、CRC插件生成与诊断、测试数据记录…

MPI hello world SSH 免密互联

目标&#xff1a; 我们想实现2台主机免密互联&#xff0c;将MPI Hello World跑起来 假设hostname是node01,node02,&#xff08;Linux shell窗口一般是UserNameHostName&#xff0c;node1和node2一定要和HostName一样&#xff09; hostname是/etc/hosts中的配置&#xff0c;如下…

阶段三:项目开发---大数据系统基础环境准备:任务1:准备系统运行的先决条件

任务描述 知识点&#xff1a; 大数据基础环境准备 重 点&#xff1a; SSH免密码连接 安装配置JDK 安装配置Scala 难 点&#xff1a; 无 内 容&#xff1a; 项目开发测试环境为分布式集群环境&#xff0c;在当前项目中使用多台基于CentOS 64bit 的虚拟机来模拟生产…

Kotlin和Java的一些不同点

1.Kotlin 的变量是没有默认值的&#xff08;因此要求初始化&#xff09;&#xff0c;Java的成员变量是有默认值的 Java的成员变量&#xff1a; String name; // 默认值是 null int count; // 默认值是 0不过其实 Java 也只是成员变量有默认值&#xff0c;局部变量也是没有默…

Java 应用启动时出现编译错误进程会退出吗?

背景 开发的尽头是啥呢&#xff1f;超超级熟练工&#xff01; 总结最近遇到的一些简单问题&#xff1a; Java 应用的某个线程&#xff0c;如果运行时依赖的 jar 不满足&#xff0c;线程是否会退出&#xff1f;进程是否会退出&#xff1f;Netty 实现 TCP 功能时&#xff0c;换…

机器学习10大算法

【机器学习】十大算法之一 “朴素贝叶斯” 【机器学习】十大算法之二 “K-means” 【机器学习】十大算法之三 “KNN” 【机器学习】十大算法之四 “SVM” 【机器学习】十大算法之五 “决策树” 【机器学习】十大算法之六 “随机森林” 【机器学习】十大算法之七 “线性回归” 【…

前后端分离:四种开发模式与实践指南

前后端分离&#xff1a;四种开发模式与实践指南 什么是前后端分离 当业务变得越来越复杂或产品线越来越多时&#xff0c;原有的开发模式就无法满足业务需求了。 产品越来越多&#xff0c;展现层的变化越来越快、越来越多&#xff0c;此时应该进行前后端分离的分层抽象&#…

IAST面面观 | 灰盒测试IAST与安全策略制定

灰盒测试IAST可实时监测和分析运行中的应用程序&#xff0c;准确发现安全漏洞和风险&#xff0c;为企业提供更全面、深入的安全洞察。然而&#xff0c;仅仅拥有先进的技术并不足以保障系统安全&#xff0c;合理有效的安全略才是将IAST价值最大化的关键&#xff0c;也能正确指导…

记录问题:解决vscode找不到Python自定义模块,报错No module named ‘xxx‘

1. 背景 我非要用vscode&#xff0c;不用pycharm&#xff0c;哼&#xff01; 2. 问题 由于 import xx 自定义的模块&#xff0c; python run 的时候会报错 No module named ‘xxx‘ 报错信息&#xff1a; Traceback (most recent call last):File "d:\work\sf_financ…

基于opencv的斜光测距及python实现

1.前言 最近做了一个基于opencv的斜光测距的小项目&#xff0c;东西不多&#xff0c;但是很有意思&#xff0c;值得拿出来学一学。项目里面需要比较精确的定位功能&#xff0c;将前人matlab代码移植到python上&#xff0c;并且做了一些优化&#xff0c;简化逻辑(毕竟我是专业的…

pandas数据分析(7)

组合DataFrame 连接 如果只是要将多个DataFrame粘合在一起&#xff0c;那么concat函数是最佳选择。在默认情况下&#xff0c;concat会将DataFrame按行粘合在一起&#xff0c;同时会将各列自动对齐。 如果想要按列进行粘合&#xff0c;需要将axis设置为1&#xff1a; concat的特…