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

【算法专题突破】双指针 - 最大连续1的个数 III(11)

目录

1. 题目解析

2. 算法原理

3. 代码编写

写在最后:


1. 题目解析

题目链接:1004. 最大连续1的个数 III - 力扣(Leetcode)

这道题不难理解,其实就是求出最长的连续是1的子数组,

但是,他支持了一个操作,就是可以翻转k个0变成1。

这个条件一出来,这道题的难度就上来了,情况变得比较的复杂。 

2. 算法原理

然后我们就可以想一想应该怎么抽象出一条规则:

将这个问题转化成:找出最长的子数组,0的个数不超过k个即可,

如果使用暴力枚举,思路还是比较简单的。

基于暴力枚举,我们可以使用滑动窗口来优化这道题,

其实最难的一步:转化问题我们已经做完了,我们只需要根据这个思路设计滑动窗口即可,

我们维护一个窗口,

当0的数量小于2的时候,不断扩大窗口,

当0的数量等于2的时候,我们记录最长的子数组,

当0的数量大于2的时候,我们缩小窗口,直到0的数量小于等于2

来看代码:

3. 代码编写

class Solution {
public:int longestOnes(vector<int>& nums, int k) {unordered_map<int, int> win;int len = 0, left = 0, right = 0;while(right < nums.size()) {len = max(len, right - left);win[nums[right++]]++;while(left < nums.size() && win[0] > k) {win[nums[left++]]--;}}len = max(len, right - left);return len;}
};

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果感到有所收获的话可以给博主点一个哦。

如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~

http://www.lryc.cn/news/164262.html

相关文章:

  • java实现备忘录模式
  • aardio语言的通用数据表维护
  • 手写RPC框架--7.封装响应
  • Linux入门教程||Linux系统目录结构
  • LeetCode 88. 合并两个有序数组
  • C语言实现扫雷小游戏
  • 【linux基础(五)】Linux中的开发工具(上)---yum和vim
  • C++学习之list的实现
  • 一种高效且节约内存的聚合数据结构的实现
  • 机器学习(10)---特征选择
  • Python之数据库(MYSQL)连接
  • 【建站教程】使用阿里云服务器怎么搭建网站?
  • 【自然语言处理】关系抽取 —— MPDD 讲解
  • 深入理解JVM虚拟机第三篇:JVM的指令集架构模型和JVM的生命周期
  • [小尾巴 UI 组件库] 组件库配置与使用
  • Linux系统中fork()函数的理解
  • Linux网络编程:网络协议及网络传输的基本流程
  • 【大数据之Kafka】十、Kafka消费者工作流程
  • 如何确保ChatGPT的文本生成对特定行业术语的正确使用?
  • 行业追踪,2023-09-11
  • LVS + Keepalived群集
  • springboot将jar改成war
  • 从9.10拼多多笔试第四题产生的01背包感悟
  • 搭建自己的OCR服务,第一步:选择合适的开源OCR项目
  • 【C++】VScode配置C/C++语言环境(简洁易懂版)
  • 【hive】—原有分区表新增加列(alter table xxx add columns (xxx string) cascade;)
  • verilog学习笔记7——PMOS和NMOS、TTL电路和CMOS电路
  • Java知识点二
  • 基于单片机压力传感器MPX4115检测-报警系统-proteus仿真-源程序
  • Pytorch02 神经网路搭建步骤