LeetCode-1004. 最大连续1的个数 III

每日一题系列(day 20)

前言

🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈

🔎🔎如果说代码有灵魂,那么它的灵魂一定是👉👉算法👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路🏇🏇,我们要做的,就是斩妖除魔💥💥,打怪升级!💪💪当然切记不可😈走火入魔😈,每日打怪,拾取经验,终能成圣🙏🙏!开启我们今天的斩妖之旅吧!✈️✈️


题目:

给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k 个 0 ,则返回 数组中连续 1 的最大个数 。

示例1:

在这里插入图片描述
示例2:

在这里插入图片描述
提示:

  • 1 <= nums.length <= 105
  • nums[i] 不是 0 就是 1
  • 0 <= k <= nums.length

解法一(暴力枚举):


  首先分析题目,给定k个数,可以将数组里的0翻转为最多k个1,并且要求返回翻转后最长1的子数组。如果我们直观上来看的话,翻转0为最长子数组的情况可能不止一种,但是我们子数组最长的长度却是不变的。
  所以当翻转0的位置不同时,但是却造成了最长子数组长度相同,我们就不用管0翻转的顺序了。

  但是我们如何找出这个最长子数组呢?既然是数组,我们不妨可以枚举出所有情况,最后在返回最长子数组。
  既然要确定子数组的长度,那么就一定要有两个指针在数组上遍历,由于0的个数有限制,所以我们可以考虑使用计数器来统计0的个数,而被统计的0就相当于翻转成为了1。
  当0的个数超出限制后,我们本次遍历结束,在全局范围内设置一个ret变量接收本次遍历的最长子数组。左指针向后移动一位,右指针重置,开启第二轮遍历,直到遍历完。

  这里也可以优化一下,如果数组当中0的个数小于等于k,那么就相当于整个数组皆可以翻转,直接返回整个数组的长度即可。

代码演示:

class Solution {
public:int longestOnes(vector<int>& nums, int k) {int sum_one = 0;//统计最长的1的子数组长度int sum_zero = 0;//统计0的个数for(int i = 0; i < nums.size() ; ++i) if(nums[i] == 0) sum_zero++;//0的个数if(sum_zero <= k) return nums.size();//k多0少的情况for(int i = 0 ; i < nums.size() ; ++i)//正常情况,i相当于左指针{int cnt = k;//将k赋值为cnt,当cnt >= 0 时为合法范围for(int j = i ; j < nums.size() ; ++j)//右指针移动{if(nums[j] == 0)//当数组元素为0时,翻转{cnt--;}if(cnt >= 0)//符合条件每次都计算长度{sum_one = max(j - i + 1, sum_one);//下标从0开始的,所以要加一}}}return sum_one;}
};

在这里插入图片描述
  但是这种暴力解法在本题时跑不过的,时间限制原因,所以我们只有另想他法,尽量去优化时间复杂度。


解法二(滑动窗口):

  虽然暴力枚举不能通过测试用例,但是也给我们提供了良好的思路,用双指针来解决问题,我们来分析上面的暴力解法有什么不妥?

  首先,我们其实没有必要全枚举,如果当右指针遇到0的时候,如果我们回退到i + 1的位置,那么从i + 1到上一次遍历的最远位置不就重新遍历了一遍?这种多余的遍历我们并不需要。
  所以当右指针遇到0的个数满了的时候,我们将左指针进行右移。
  加上了这一步,我们就可以将时间复杂度从O(n^2)降为O(n)了。最后需要注意的是,如果当左指针走过0的时候,我们最长子数组里面就少了个0,这个时候我们的计数器就该减去1了,每次循环我们都进行判断最长子数组。最后返回即可。

代码演示:

class Solution {
public:int longestOnes(vector<int>& nums, int k) {int ret = 0;int sum_zero = 0;for(int left = 0, right = 0; right < nums.size() ; ++right){if(nums[right] == 0) sum_zero++;//统计翻转0个数while(sum_zero > k)//个数超了后移动左指针{if(nums[left++] == 0) sum_zero--;//越过0,子数组中的0就减少了,所以计数器也要自减}ret = max(ret, right - left + 1);//返回最终结果}return ret;}
};

在这里插入图片描述


总结:

  这题是一个很经典的滑动窗口的问题,结合我们之前做的滑动窗口的问题来看,滑动窗口出现的场景通常需要枚举数组所有情况,也就是暴力,然后我们在暴力的基础上进行优化。

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

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

相关文章

腾讯云轻量应用服务器“月流量”是什么意思?

腾讯云轻量应用服务器“月流量”什么意思&#xff1f;月流量是指限制每月流量的意思&#xff0c;腾讯云百科以2核2G3M轻量应用服务器为例&#xff0c;官方配置页面 https://www.txybk.com/go/txy/ 链接打开如下图&#xff1a; 轻量应用服务器限制月流量 如上图所示&#xff0c;…

Datawhale【Sora原理与技术实战】| 学习笔记2

这里写目录标题 一. 基于Transformers的架构的Diffusion模型二. Transformers技术解析1. 什么是ViT2. ViViT&#xff1a;视频ViT 一. 基于Transformers的架构的Diffusion模型 相当于融合了基于自回归方式的模型和基于扩散&#xff08;diffusion&#xff09;方式的模型 第一步&…

新规正式发布 | 百度深度参编《生成式人工智能服务安全基本要求》

2024年2月29日&#xff0c;全国网络安全标准化技术委员会&#xff08; TC260 &#xff09;正式发布《生成式人工智能服务安全基本要求》&#xff08;以下简称《基本要求》&#xff09;。《基本要求》规定了生成式人工智能服务在安全方面的基本要求&#xff0c;包括语料安全、模…

【kaggle代码】Plant Seedlings Classification (使用Resnet-18完成分类任务)

比赛地址&#xff1a;植物种子分类 注意的点&#xff1a; 使用datasets.ImageFolder读取数据&#xff0c;并且制作数据集。分类任务与图像分割任务不同。分类任务的数据是&#xff1a;【图片&#xff0c;标签&#xff08;字符串类型&#xff09;】&#xff0c;所以两者的数据读…

ArrayDeque集合源码分析

ArrayDeque集合源码分析 文章目录 ArrayDeque集合源码分析一、字段分析二、构造函数分析方法、方法分析四、总结 实现了 Deque&#xff0c;说面该数据结构一定是个双端队列&#xff0c;我们知道 LinkedList 也是双端队列&#xff0c;并且是用双向链表 存储结构的。而 ArrayDequ…

【Redis知识点总结】(二)——Redis高性能IO模型剖析

Redis知识点总结&#xff08;二&#xff09;——Redis高性能IO模型及其事件驱动框架剖析 IO多路复用传统的阻塞式IO同步非阻塞IOIO多路复用机制 Redis的IO模型Redis的事件驱动框架 IO多路复用 Redis的高性能的秘密&#xff0c;在于它底层使用了IO多路复用这种高性能的网络IO&a…

2024年装修新潮流,你get到了吗?福州中宅装饰,福州装修

在装修这个行业&#xff0c;每年都会出现一些新的设计理念和流行趋势&#xff0c;同时也存在一些传统的设计理念。今天&#xff0c;我们就来对比一下2024年装修设计的传统与新趋势。 传统设计理念 1. 落地电视柜 在过去&#xff0c;落地电视柜被认为是一种实用的设计&#xf…

React-路由小知识

1.默认路由 说明&#xff1a;当访问的是一级路由时&#xff0c;默认的二级路由组件可以得到渲染&#xff0c;只需要在二级路由的位置去掉path,设置index.属性为true。 2.404路由 说明&#xff1a;当浏览器输入ul的路径在整个路由配置中都找不到对应的pth,为了用户体验&#x…

深入理解React中的useReducer:管理复杂状态逻辑的利器

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Coggle数据科学 | 小白学数据科学:20个技术和框架(建议收藏!)

本文来源公众号“Coggle数据科学”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;小白学数据科学&#xff1a;20个技术和框架 随着互联网使用率的增长&#xff0c;公司如何利用数据进行创新和获得竞争优势。截至2024年1月&#x…

Qt 实现诈金花的牌面值分析工具

诈金花是很多男人最爱的卡牌游戏 , 每当你拿到三张牌的时候, 生活重新充满了期待和鸟语花香. 那么我们如果判断手中的牌在所有可能出现的牌中占据的百分比位置呢. 这是最终效果: 这是更多的结果: 在此做些简单的说明: 炸弹(有些地方叫豹子) > 同花顺 > 同花 > 顺…

css--浮动

一. 浮动的简介 在最初&#xff0c;浮动是用来实现文字环绕图片效果的&#xff0c;现在浮动是主流的页面布局方式之一。 二. 元素浮动后的特点 &#x1f922;脱离文档流。&#x1f60a;不管浮动前是什么元素&#xff0c;浮动后&#xff1a;默认宽与高都是被内容撑开&#xff0…