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

中位数贪心,3086. 拾起 K 个 1 需要的最少行动次数

一、题目

1、题目描述

给你一个下标从 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 所需的 最少 行动次数。

2、接口描述

python3
 ​
class Solution:def minimumMoves(self, nums: List[int], k: int, maxChanges: int) -> int:
cpp
 ​
class Solution {
public:long long minimumMoves(vector<int>& nums, int k, int maxChanges) {}
};
js
/*** @param {number[]} nums* @param {number} k* @param {number} maxChanges* @return {number}*/
var minimumMoves = function(nums, k, maxChanges) {};
 ​

3、原题链接

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


二、解题报告

1、思路分析

操作1其实就是提供了一种两步得到1的方案

我们考虑两步一个1一定是最优的吗?

如果1、2、3个连续个1,我们发现此时分别需要0、1、2步

所以这道题是有corner case的

我们这样考虑

3个以内的连续1的最大连续长度记为c,如果拿掉c个剩下的1可以都通过2步得到

我们的答案就是c - 1 + (k - c) * 2

否则,问题就变成了一个很简单的中位数贪心问题

扫描一遍k - maxChanges的窗口,O(1)计算其中位数贪心下的解维护最优解即可

2、复杂度

时间复杂度: O(N)空间复杂度:O(N)

3、代码详解

python3
 ​
fmax = lambda x, y: x if x > y else y
fmin = lambda x, y: x if x < y else y
class Solution:def minimumMoves(self, nums: List[int], k: int, maxChanges: int) -> int:pos = []c = 0for i, x in enumerate(nums):if x == 0:continuepos.append(i)c = fmax(c, 1)if i > 0 and nums[i - 1]:if i > 1 and nums[i - 2]:c = 3c = fmax(c, 2)c = fmin(c, k)if maxChanges >= k - c:return fmax(c - 1, 0) + (k - c) * 2n = len(pos)acc = list(accumulate(pos, initial=0))res = infsz = k - maxChangesfor r in range(sz, n + 1):l = r - szmid = l + sz // 2s1 = pos[mid] * (mid - l) - (acc[mid] - acc[l])s2 = acc[r] - acc[mid] - pos[mid] * (r - mid)res = fmin(res, s1 + s2)return res + maxChanges * 2
cpp
 ​
class Solution {
public:long long minimumMoves(vector<int>& nums, int k, int maxChanges) {int c = 0;std::vector<int> pos;for (int i = 0, n = nums.size(); i < n; i ++ ) {if (!nums[i]) continue;pos.push_back(i);c = max(c, 1);if (i && nums[i - 1]) {if (i > 1 && nums[i - 2])c = 3;c = max(c, 2);}}c = min(c, k);if (maxChanges >= k - c)return max(c - 1, 0) + (k - c) * 2;int n = pos.size(), sz = k - maxChanges;std::vector<long long> acc(n + 1);for (int i = 0; i < n; i ++ ) acc[i + 1] = acc[i] + pos[i];long long res = 1e10;for (int r = sz; r <= n; r ++ ) {int l = r - sz, mid = l + sz / 2;long long s1 = 1LL * pos[mid] * (mid - l) - (acc[mid] - acc[l]);long long s2 = acc[r] - acc[mid] - 1LL * pos[mid] * (r - mid);res = min(res, s1 + s2);\}return res + maxChanges * 2LL;}
};
js
 ​
/*** @param {number[]} nums* @param {number} k* @param {number} maxChanges* @return {number}*/
var minimumMoves = function(nums, k, maxChanges) {let c = 0;let pos = [];for (let i = 0; i < nums.length; i ++ ) {if (nums[i] == 0) continue;pos.push(i);c = Math.max(c, 1);if (i && nums[i - 1]) {if (i > 1 && nums[i - 2])c = 3;c = Math.max(c, 2);}}c = Math.min(c, k);if (maxChanges >= k - c)return Math.max(c - 1, 0) + (k - c) * 2;let n = pos.length;let acc = new Array(n + 1).fill(0);for (let i = 0; i < n; i ++ )acc[i + 1] = pos[i] + acc[i];let res = Infinity, sz = k - maxChanges;for (let r = sz; r <= n; r ++ ) {let l = r - sz, mid = l + parseInt(sz / 2);let s1 = pos[mid] * (mid - l) - (acc[mid] - acc[l]);let s2 = acc[r] - acc[mid] - pos[mid] * (r - mid);res = Math.min(res, s1 + s2);}return res + maxChanges * 2;
};

相关文章:

中位数贪心,3086. 拾起 K 个 1 需要的最少行动次数

一、题目 1、题目描述 给你一个下标从 0 开始的二进制数组 nums&#xff0c;其长度为 n &#xff1b;另给你一个 正整数 k 以及一个 非负整数 maxChanges 。 Alice 在玩一个游戏&#xff0c;游戏的目标是让 Alice 使用 最少 数量的 行动 次数从 nums 中拾起 k 个 1 。游戏开始…...

xml_woarchive undefined symbol

最近在linux中编译一个自己写的老代码。是个C动态库。可以编译成功&#xff0c;但直到运行的时候才报 boost xml_woarchive undefined symbol. 解决的方法是在编译时要加上 wserialization 库。 注意&#xff0c;这个库有含 w 和不含 w 两个。在我这里需要使用含 w 的。 如果…...

SiCat:一款多功能漏洞利用管理与搜索工具

关于SiCat SiCat是一款多功能漏洞利用管理与搜索工具&#xff0c;该工具基于纯Python 3开发&#xff0c;旨在帮助广大研究人员有效地识别和收集来自开源和本地存储库的漏洞信息。 SiCat专注于网络安全管理方面的实践工作&#xff0c;允许研究人员快速实现在线搜索&#xff0c;…...

毕业论文初稿写作方法与过程

毕业论文初稿写作方法与过程 毕业论文是大学生在学业结束前必须完成的一项重要任务&#xff0c;它不仅是对学生所学知识的综合运用&#xff0c;也是对学生研究能力和写作能力的检验。写好毕业论文初稿是完成高质量毕业论文的关键一步。下面将具体阐述毕业论文初稿的写作方法和过…...

SLAM 精度评估

SLAM 精度的评估有两个最重要的指标&#xff0c;即绝对轨迹误差&#xff08;ATE&#xff09;和相对位姿误差&#xff08;RPE&#xff09;的 均方根误差&#xff08;RMSE&#xff09;: 绝对轨迹误差:直接计算相机位姿的真实值与 SLAM 系统的估计值之间的差值&#xff0c;首先将…...

Postman使用教程

传统接口风格 RESTful风格 使用Postman完成测试用例目标&#xff1a; Postman教程 &#xff08;1&#xff09;准备工作&#xff0c;下载Postman新建 &#xff08;2&#xff09;登录接口调试-获取验证码 &#xff08;3&#xff09;登录接口调试-登录 &#xff08;4&#xff09;…...

UDP协议深入解析

一. UDP报文结构 UDP报文由以下4个字段组成: 源端口号(Source Port)&#xff1a;16位,标识发送方的端口号。如果发送方没有使用端口号,则该字段为0。 目标端口号(Destination Port)&#xff1a;16位,标识接收方的端口号。 长度(Length)&#xff1a;16位,表示UDP报文的总长度,…...

Rethinking Federated Learning with Domain Shift: A Prototype View

CVPR2023,针对分布式数据来自不同的域时,私有模型在其他域上表现出退化性能(具有域转移)的问题。提出用于域转移下联邦学习的联邦原型学习(FPL)。核心思想是构建集群原型和无偏原型,提供富有成效的领域知识和公平的收敛目标。将样本嵌入拉近到属于相同语义的集群原型,而…...

打卡第2天----数组双指针,滑动窗口

今天是参与训练营第二天&#xff0c;这几道题我都看懂了&#xff0c;自己也能写出来了&#xff0c;实现思路很重要&#xff0c;万事开头难&#xff0c;希望我可以坚持下去。希望最后的结果是量变带来质变。 一、理解双指针思想 leetcode编号&#xff1a;977 不止是在卡尔这里…...

Running cmake version 2.8.12.2解决方案

Centos7安装mysql8.0&#xff0c;编译环节出现如下报错&#xff1a; Running cmake version 2.8.12.2 CMake Warning at CMakeLists.txt:82 (MESSAGE):Please use cmake3 rather than cmake on this platform-- Please install cmake3 (yum install cmake3) CMake Error at CMa…...

stm32中IIC通讯协议

参考资料&#xff1a;大部分均引用b站江协科技课程、GPT及网络资料 什么是IIC&#xff08;i2C&#xff09;通讯协议&#xff1f; 关键字&#xff1a;SCL、SDA、半双工、同步、串行。 IIC&#xff08;Inter-Integrated Circuit&#xff09;&#xff0c;也称为I2C&#xff08;In…...

允许防火墙通过端口 6379(通常用于 Redis 服务)那些年因为连接失败而一起熬过的夜

要允许防火墙通过端口 6379&#xff08;通常用于 Redis 服务&#xff09;&#xff0c;您可以按照以下步骤在防火墙中添加规则。这里提供了使用 firewalld 和 ufw 两种常见防火墙管理工具的方法。 使用 firewalld &#xff08;CentOS、Red Hat 等&#xff09; 1. 启动并启用 f…...

tsconfig.json的include和exclude作用

tsconfig.json中的include和exclude属性用于指定需要被编译的TypeScript文件和需要被排除的文件。‌ include属性&#xff1a;‌用于指定哪些.ts、‌.tsx或.d.ts文件需要被编译。‌如果不指定include属性&#xff0c;‌则默认当前目录下除了exclude之外的所有.ts、‌.d.ts、‌…...

firewalld(8) policies

简介 前面的文章中我们介绍了firewalld的一些基本配置以及NAT的相关配置。在前面的配置中&#xff0c;我们所有的策略都是与zone相关的&#xff0c;例如配置的rich rule&#xff0c;--direct,以及NAT,并且这些配置都是数据包进入zone或者从zone发出时设置的策略。 我们在介绍…...

为什么进口主食冻干那么高贵?必入榜主食冻干总结分享

新手养猫人常常会有这样的疑问&#xff1a;为何进口主食冻干价格如此昂贵&#xff0c;但仍有大量养猫达人对其推崇备至&#xff1f;与国产主食冻干相比&#xff0c;进口产品的价格高出3-4倍之多&#xff0c;那么这高昂的价格背后&#xff0c;进口主食冻干是否真的值得推荐&…...

状态模式在金融业务中的应用及其框架实现

引言 状态模式&#xff08;State Pattern&#xff09;是一种行为设计模式&#xff0c;它允许对象在内部状态改变时改变其行为。状态模式通过将状态的相关行为分离到独立的状态类中&#xff0c;使得状态转换更加明确和简洁。在金融业务中&#xff0c;状态模式可以用于实现交易状…...

redis学习(002 安装redis和客户端)

黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 总时长 42:48:00 共175P 此文章包含第5p-第p7的内容 文章目录 安装redis启动启动方式1&#xff1a;可执行文件启动启动方式2 基于配置文件启动修改redis配置文件 …...

在线客服系统多国语言,适合跨境外贸业务对外沟通 ,哈萨克语客服系统,根据浏览器语种标识自动切换...

我们看一下我们客服系统的哈萨克语展示。 演示网站&#xff1a;gofly.v1kf.com 有个客户&#xff0c;他们的业务主要是位于哈萨克斯坦&#xff0c;需求是访客端使用哈萨克语来展示。 现在这个界面就是哈萨克语的。当然&#xff0c;也可以切换成中文。界面上的文案已经切换成中文…...

等保2.0是否强制要求所有物联网设备都必须支持自动更新?

等保2.0对物联网设备自动更新的要求 等保2.0&#xff08;网络安全等级保护2.0&#xff09;是中国政府为了加强网络安全而推出的一套标准和要求。在物联网设备的安全管理方面&#xff0c;等保2.0确实提出了一系列措施&#xff0c;以确保设备的软件安全更新。这些措施包括&#…...

gin框架解决跨域问题

文章目录 前言一、使用github.com/gin-contrib/cors 前言 今天遇到了前后端跨域问题&#xff0c;前后端跨域解决蛮简单的&#xff0c;下面是解决方案 一、使用github.com/gin-contrib/cors go get github.com/gin-contrib/cors在路由的地方 r : gin.Default()corsConfig : c…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...