【滑动窗口】【差分数组】C++算法:K 连续位的最小翻转次数

作者推荐

动态规划 多源路径 字典树 LeetCode2977:转换字符串的最小成本

本题涉及知识点

滑动窗口 差分数组

LeetCode995: K 连续位的最小翻转次数

给定一个二进制数组 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]
参数范围
1 <= nums.length <= 105
1 <= k <= nums.length

滑动窗口+差分数组

时间复杂度 O(n)。
如果nums中不存在0,则直接返回0。
令nums[i1]等于0,如果有多个符合的i1,取最小值。设某次翻转[i,i+k),则i的最小值一定为i1。且一定只翻转一次。
翻转奇数次和翻转一次的效果完全一样,所以不需要翻转1以外的奇数次。
翻转偶数次,和没翻转效果一样。所以没必要翻转偶数次。

i < i1翻转一次后nums[i]变成0,不符合题意
i>i1nums[i1]为0,不符合题意

翻转i1后,类似原理处理nums[i1+1…],直到处理完毕。

差分数组

翻转[i,i+len)不需要修改nums[i,i+k)的值,那样的时间复杂度是O(k)。修改vDiff[i]++,vDiff[i+len]-- 就可以了。
i的翻转次数就是vDiff[0,i]之和。差分数组单个修改的时间复杂为O(1)。

只能翻转k次,不能翻转k-1次

即i+len <= n 。最后的k-1个元素无法翻转。

代码

核心代码

class Solution {
public:
	int minKBitFlips(vector<int>& nums, int k) {
		m_c = nums.size();
		vector<int> vDiff(m_c+1);
		int iRet = 0;
		int iDiff = 0;
		int i = 0;
		for (; i+k-1 < m_c; i++)
		{
			iDiff += vDiff[i];
			int n = (nums[i] + iDiff) % 2;
			if (0 == n)
			{
				iRet++;
				iDiff++;
				vDiff[i + k]--;
			}
		}
		for (; i  < m_c; i++)
		{
			iDiff += vDiff[i];
			int n = (nums[i] + iDiff) % 2;
			if (0 == n)
			{
				return -1;
			}
		}
		return iRet;
	}
	int m_c;
};

测试用例

template<class T>
void Assert(const T& t1, const T& t2)
{
	assert(t1 == t2);
}

template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{
	if (v1.size() != v2.size())
	{
		assert(false);
		return;
	}
	for (int i = 0; i < v1.size(); i++)
	{
		Assert(v1[i], v2[i]);
	}
}


int main()
{
	vector<int> nums = { 1, 2, 1, 2, 3 };
	int k = 2;
	{
		Solution sln;
		nums = { 0,1,0 }, k = 1;
		auto res = sln.minKBitFlips(nums, k);
		Assert(2, res);
	}
	{
		Solution sln;
		nums = { 1,1,0 }, k = 2;
		auto res = sln.minKBitFlips(nums, k);
		Assert(-1, res);
	}
	{
		Solution sln;
		nums = { 0,0,0,1,0,1,1,0 }, k = 3;
		auto res = sln.minKBitFlips(nums, k);
		Assert(3, res);
	}
}

2023年3月版

class Solution {
public:
int minKBitFlips(vector& nums, int k) {
m_c = nums.size();
//差分数组
vector v(m_c);
int iVTotal = 0;
int iRet = 0;
for (int i = 0; i < m_c; i++)
{
iVTotal += v[i];
const int iCur = (nums[i] + iVTotal)%2 ;
if (0 == iCur)
{
if (i + k > m_c)
{
return -1;
}
v[i]++;
if (i + k != m_c)
{
v[i + k]–;
}
iVTotal++;
iRet++;
}
}
return iRet;
}
int m_c;
};

2023年7月版

class Solution {
public:
int minKBitFlips(vector& nums, int k) {
m_c = nums.size();
vector vDiff(m_c + 1);
int iRotaNum = 0;
int iRota = 0;
for (int i = 0; i < m_c; i++)
{
iRota += vDiff[i];
const int iCur = (0 == iRota % 2) ? nums[i] : (1 - nums[i]);
if (1 == iCur )
{
continue;
}
const int iEnd = i + k;
if (iEnd > m_c)
{
return -1;
}
iRotaNum++;
iRota++;
vDiff[i]++;
vDiff[iEnd]++;
}
return iRotaNum;
}
int m_c;
};

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快

速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法C++ 实现。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Halcon颜色通道的处理decompose3/image_to_channels/channels _to _image

Halcon颜色通道的处理 文章目录 Halcon颜色通道的处理一. 图像的通道二. 访问通道1.访问通道2.获取通道的数量 三. 通道分离与合并1. decompose3算子2. image_to_channels 算子3. compose3算子4. channels_to_image算子 四. 处理RGB信息 由于彩色图像通常包含不止一个通道&…

@Zabbix监控网络设备Trap接口UPDOWN关联告警配置

网络设备Trap接口UPDOWN关联告警配置 文章目录 网络设备Trap接口UPDOWN关联告警配置SNMPTrap描述1.监控平台监控项配置2.监控平台日志接收3.监控平台触发器配置4.监控平台触发器功能测试1&#xff09;告警触发2&#xff09;告警恢复 5.告警解析 SNMPTrap描述 在Zabbix中&#x…

网络基础操作练习

知识改变命运&#xff0c;技术就是要分享&#xff0c;有问题随时联系&#xff0c;免费答疑&#xff0c;欢迎联系&#xff01; 手把手教你操作华为设备&#xff0c;新手必看。 实验拓扑图 关于命令行视图 1&#xff09;用户视图 <Huawei> 2&#xff09;系统视图 [Hu…

超维空间S2无人机使用说明书——51、基础版——使用yolov8进行目标跟踪

引言&#xff1a;为了提高yolo识别的质量&#xff0c;提高了yolo的版本&#xff0c;改用yolov8进行物体识别&#xff0c;同时系统兼容了低版本的yolo&#xff0c;包括基于C的yolov3和yolov4&#xff0c;以及yolov7。 简介&#xff0c;为了提高识别速度&#xff0c;系统采用了G…

添加 Android App Links

添加 Android App Links功能 介绍一个简单的效果Android配置Add Url intent filtersAdd logic to handle the intentAssociate website 搭建网页支持AppLinks 介绍 Android App Links 是指将用户直接转到 Android 应用内特定内容的 HTTP 网址。Android App Links 可为您的应用带…

大数据学习(30)-Spark Shuffle

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 承认自己的无知&#xff0c;乃是开启智慧的大门 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博主哦&#x1f91…

re:Invent 2023技术上新|Amazon DynamoDB与OpenSearch Service的Zero-ETL集成

Amazon DynamoDB 与 Amazon OpenSearch Service 的 Zero-ETL 集成已正式上线&#xff0c;该服务允许您通过自动复制和转换您的 DynamoDB 数据来搜索数据&#xff0c;而无需自定义代码或基础设施。这种 Zero-ETL 集成减少了运营负担和成本&#xff0c;使您能够专注于应用程序。这…

用通俗易懂的方式讲解大模型:基于 Langchain 和 ChatChat 部署本地知识库问答系统

之前写了一篇文章介绍基于 LangChain 和 ChatGLM 打造自有知识库问答系统&#xff0c;最近该项目更新了0.2新版本&#xff0c;这个版本与之前的版本差别很大&#xff0c;底层的架构发生了很大的变化。 该项目最早是基于 ChatGLM 这个 LLM&#xff08;大语言模型&#xff09;来…

【SAP-FICO】--总账标识配置路径OBXR

FICO业务需求&#xff1a; F-02&#xff0c;财务会计凭证填写09客户A时&#xff0c;带出的总账标识为可编辑。 需求截图&#xff1a; 第一步&#xff1a;了解需求 首先&#xff0c;我们要明白&#xff0c;财务凭证生成&#xff0c;是分多种类型&#xff08;不同类型的凭证&a…

HarmonyOS自学-Day4(TodoList案例)

目录 文章声明⭐⭐⭐让我们开始今天的学习吧&#xff01;TodoList小案例 文章声明⭐⭐⭐ 该文章为我&#xff08;有编程语言基础&#xff0c;非编程小白&#xff09;的 HarmonyOS自学笔记&#xff0c;此类文章笔记我会默认大家都学过前端相关的知识知识来源为 HarmonyOS官方文…

ES6+ 面试常问题

一、let const var 的区别 1. var&#xff1a; 没有块级作用域的概念&#xff0c;有函数作用域和全局作用域的概念全局作用域性下创建变量会被挂在到 windows 上存在变量提升同一作用域下&#xff0c;可以重复赋值创建未初始化&#xff0c;值为 undefined 2. let&#xff1a…

相机删除视频恢复后损坏打不开修复方法

同事对热恋5年的女朋友精心准备了一场浪漫求婚仪式&#xff0c;让朋友帮忙用单反相机拍摄记录这一美好时刻。不巧的的是朋友清理相机空间时&#xff0c;不小心把这一视频删除了&#xff0c;找人帮忙把视频恢复了&#xff0c;却无奈发现恢复出来的视频播放不了&#xff0c;真是好…

【第4期】Springboot集成阿里云对象存储OSS+Vue+Iview文件上传组件

本期简介 文件上传是非常常见的功能&#xff0c;本期要实现的功能是将文件存储到阿里云分布式对象存储OSS中&#xff0c;这样做的好处是随便哪里都可以方便的展示出该图片&#xff0c;并且图片以链接形式在客户端浏览器渲染&#xff0c;流量不会经过后台&#xff0c;降低后台压…

【23.12.29期--Spring篇】Spring的 IOC 介绍

介绍一下Spring的IOC ✔️引言✔️ lOC的优点✔️Spring的IOC✔️ 拓展知识仓✔️IOC是如何实现的&#xff1f; ✔️引言 所谓的IOC (inversion of control) &#xff0c;就是控制反转的意思。何为控制反转? 在传统的程序设计中&#xff0c;应用程序代码通常控制着对象的创建和…

Pycharm 切换interpreter---python的环境和第三方库问题

这篇回答两个问题&#xff1a; 1.为什么在 pycharm中打开新的project&#xff0c;切换interpreter 之后发现自己之前装的库消失了&#xff1f; 2.为什么 interpreter 切换到python3.8了&#xff0c; terminal 还是在 3.9&#xff1f;&#xff1f; 问题的关键&#xff1a;搞懂什…

STM32CubeMX学习(二) USB CDC 双向通信

STM32CubeMX学习&#xff08;二&#xff09; USB CDC 双向通信 简介CubeMX新建工程&#xff08;串口LED&#xff09;测试串口和LED串口接收测试USB CDC通信 简介 利用正点原子F407探索者开发板&#xff0c;测试基于USB CDC的双向数据通信。 CubeMX新建工程&#xff08;串口LE…

工业企业出口技术复杂度测算(2000-2014年)

工业企业出口技术复杂度的测算是对工业企业出口产品的技术含量和复杂度进行评估的过程。这种测算通常涉及分析出口产品的研发强度、生产过程的复杂性、所需的技术知识水平以及产品在全球市场上的竞争力。技术复杂度高的产品可能包括高端制造业产品&#xff0c;如先进电子设备、…

如何使用idea部署springboot项目全过程

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

单机+内部备份_全备案例

此场景为单机数据库节点内部备份&#xff0c;方便部署和操作&#xff0c;但备份REPO与数据库实例处于同一个物理主机&#xff0c;冗余度较低。 前期准备 配置ksql免密登录(必须) 在Kingbase数据库运行维护中&#xff0c;经常用到ksql工具登录数据库&#xff0c;本地免密登录…

Unity | 快速修复Animation missing错误

目录 一、背景 二、效果 三、解决办法 一、背景 最近在做2D 骨骼动画相关的Demo&#xff0c;我自己使用Unity引擎进行骨骼绑定并创建了anim后&#xff0c;一切正常&#xff0c;anim也能播放。但是昨天我修改Obj及子物体的名称&#xff08;由中文改为英文&#xff0c;如&…