【数据结构-差分】【hard】力扣995. K 连续位的最小翻转次数

embedded/2024/11/10 14:08:38/

给定一个二进制数组 nums 和一个整数 k 。

k位翻转 就是从 nums 中选择一个长度为 k 的 子数组 ,同时把子数组中的每一个 0 都改成 1 ,把子数组中的每一个 1 都改成 0 。

返回数组中不存在 0 所需的最小 k位翻转 次数。如果不可能,则返回 -1 。

子数组 是数组的 连续 部分。

示例 1:
输入:nums = [0,1,0], K = 1
输出:2
解释:先翻转 A[0],然后翻转 A[2]。

示例 2:
输入:nums = [1,1,0], K = 2
输出:-1
解释:无论我们怎样翻转大小为 2 的子数组,我们都不能使数组变为 [1,1,1]。

示例 3:
输入:nums = [0,0,0,1,0,1,1,0], K = 3
输出:3
解释:
翻转 A[0],A[1],A[2]: A变成 [1,1,1,1,0,1,1,0]
翻转 A[4],A[5],A[6]: A变成 [1,1,1,1,1,0,0,0]
翻转 A[5],A[6],A[7]: A变成 [1,1,1,1,1,1,1,1]
在这里插入图片描述
差分

class Solution {
public:int minKBitFlips(vector<int>& nums, int k) {int n = nums.size();vector<int> diff(n+1);int s = 0, ans = 0;for(int i = 0; i < n; i++){//s是偶数的时候,翻转后还是原来元素,奇数时候才有效果。s += diff[i];if((nums[i] + s) % 2 == 0){s++;ans++;if(i+k > n){return -1;}diff[i+k]--;}}return ans;}
};

这道题使用差分的思路是非常巧妙的方法。

首先我们定义差分的数组diff,整型s,s实际上就是某一个元素的翻转次数,整型ans用来储存总共翻转几次区间。

我们首先需要知道,比如当k=3的时候,我们翻转某一个元素,这时候会影响到这个元素及其后面两个元素。所以当翻转某一个元素的时候,我们就令s++,然后diff[i+k]--, 他由diff[i+k-1+1]化简。这时候这个元素及后面k-1个元素都会记录被反转。

当某个元素翻转s次后,如果是偶数,说明他受前面元素的翻转影响后,会是0。要注意的是,我们在判断某一个元素是否需要主动翻转的时候,是根据他受前面被动的翻转后是否为0来判断的。

每次主动翻转就s++,然后diff[i+k],从而影响这个元素及其后面的k-1个元素。

由于diff最多到diff(n)是合法的,所以当i+k>n的时候就返回-1。


http://www.ppmy.cn/embedded/113899.html

相关文章

吸浮毛宠物空气净化器推荐,希喂、小米、有哈宠物空气净化器测评

养猫需谨慎&#xff0c;不然就要做猫奴一辈子啦&#xff01;上次堂妹来我家住几天&#xff0c;刚开始还担心和猫处不来&#xff0c;不敢去摸它&#xff0c;走的时候已经约好下次来看它的时间&#xff0c;笑死我了。毕竟猫咪这么可爱&#xff0c;很少有人可以抵抗它的魅力。 这不…

[数据集][目标检测]疟疾恶性疟原虫物种目标检测数据集VOC+YOLO格式948张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;948 标注数量(xml文件个数)&#xff1a;948 标注数量(txt文件个数)&#xff1a;948 标注类别…

商城小程序后端开发实践中出现的问题及其解决方法

前言 商城小程序后端开发中&#xff0c;开发者可能会面临多种问题。以下是一些常见的问题及其解决方法&#xff1a; 一、性能优化 问题&#xff1a;随着用户量的增加和功能的扩展&#xff0c;商城小程序可能会出现响应速度慢、处理效率低的问题。 解决方法&#xff1a; 对数…

【大数据方案】智慧大数据平台总体建设方案书(word原件)

第1章 总体说明 1.1 建设背景 1.2 建设目标 1.3 项目建设主要内容 1.4 设计原则 第2章 对项目的理解 2.1 现状分析 2.2 业务需求分析 2.3 功能需求分析 第3章 大数据平台建设方案 3.1 大数据平台总体设计 3.2 大数据平台功能设计 3.3 平台应用 第4章 政策标准保障体系 4.1 政策…

CentOS 7官方源停服,配置本机光盘yum源

1、挂载系统光盘 mkdir /mnt/iso mount -o loop /tools/CentOS-7-x86_64-DVD-1810.iso /mnt/iso cd /mnt/iso/Packages/ rpm -ivh /mnt/iso/Packages/yum-utils-1.1.31-50.el7.noarch.rpm(图形界面安装&#xff0c;默契已安装&#xff09; 如安装yum-utils依赖错误&#x…

Vue 3 中 useRouter 与 useRoute 的深度解析

在 Vue 3 中&#xff0c;vue-router 提供了两个非常重要的 Composition API 钩子&#xff1a;useRouter 和 useRoute。这两个钩子虽然都与路由相关&#xff0c;但它们的用途和返回的数据类型截然不同。本文将详细解析这两个钩子的区别及其用法&#xff0c;帮助你在 Vue 3 应用中…

【MYSQL表的增删改查(基础)】

MYSQL表的增删改查&#xff08;基础&#xff09; 一、CRUD二、新增&#xff08;Create&#xff09;2.1 单行数据全列插入2.2 多行数据指定列插入 三、查询&#xff08;Retrieve&#xff09;3.1 全列查询3.2 指定列查询3.3 查询字段为表达式3.3.1 表达式不包含字段3.3.2 表达式包…

黑马点评19——多级缓存-缓存同步

文章目录 数据同步策略安装Canal监听canal实现缓存同步数据库连接遇到问题 在多级缓存中的数据一致性问题&#xff0c;也就是缓存同步的问题 数据同步策略 要是使用消息队列的方式&#xff0c;我们还需要修改代码&#xff0c;至少需要发送一条通知吧。 canal可以监听数据库的变…