【算法】滑动窗口——最大连续1的个数

本篇文章讲的是“最大连续1的个数”这道题,从最开始的简单暴力到用滑动窗口算法实现解题的思路历程,有需要借鉴即可。

目录

  • 1.题目
  • 2.暴力求解
  • 3.滑动窗口解法
    • 3.1优化一:end重返start优化,end指针不回退
    • 3.2优化二:某一start指向下,一定不是最大的时候,直接优化掉

1.题目

题目链接:LINK
在这里插入图片描述

2.暴力求解

题目解析:这里看到题目之后,大概就是让我们找在这穿数字中连续的1最大有几个,但是这个题目还有个“翻转”的设定。

暴力求解:其实我们想到的暴力求解无非是挨个遍历,定义两个指针,一个是start指针,一个是end指针,start首先指向第一个数字,end也指向第一个数字,碰到0我们就“反转一下”,直到反转次数不足或者说是该数组遍历完成。这样的话我们可以继续start指向下一个数字,重复上述过程,期间取最大值即可。

技巧(反转转换):题目中所说的“反转”,可是我们如果真的反转了,在下一次遍历时候还得改回来,很麻烦,这里可以用个变量统计一下遇到0的个数就行,不用真的进行“翻转”。

大概是下面这个过程:
在这里插入图片描述

时间复杂度:O(N^2)

代码我写好了,除了时间复杂度问题之外,没什么问题哈。

class Solution {
public:
//暴力解法int longestOnes(vector<int>& nums, int k) {int zero = 0;int n = nums.size();int ret = 0;for(int left = 0;left < n;left++){zero = 0;int right = left;while(right < n){if(nums[right] == 1){right++;}else{zero++;if(zero > k)break;right++;}}        ret = max(ret,right - left);}return ret;}
};

时间复杂度比较高哈,虽然说这种方法很挫,但也是一种方法…我们下面在暴力求解的基础上对该题目进行优化:

3.滑动窗口解法

一上来,不可能一下就可以想到滑动窗口的。这里我必须强调一下:这里滑动窗口的解法是在暴力求解的基础上不断优化,在优化的过程中发现满足滑动窗口的规律,因而说最终优化成了滑动窗口算法。

3.1优化一:end重返start优化,end指针不回退

首先,我再看这个暴力解法的过程中,我们把不同的start位置看成不同的”组“,在不同组的时候,命名end可以继续向右移动,但是end到下一个start的时候又回到了start位置,显然十分消耗性能,因而这个地方可以优化一下。

比如说:
在这里插入图片描述
在这里插入图片描述

3.2优化二:某一start指向下,一定不是最大的时候,直接优化掉

这个优化什么意思呢?比如下图:第二组铁定比第一组短,压根就没必要去走第二组的情况
在这里插入图片描述
也就是说,第一组遍历完了,直接进行下图所示的这组,干脆直接这样:
在这里插入图片描述

然后到这里,两个指针,都是同向的,且不回退,这时候我就想到这是典型的”滑动窗口“题目,所以可以直接优化成滑动窗口解法:

class Solution {
public:
//暴力解法int longestOnes(vector<int>& nums, int k) {int zero = 0;int n = nums.size();int ret = 0;int left = 0,right = 0;for(right = 0;right < n ;right++){//进窗口if(nums[right] == 0){zero++;}//出窗口之后也会满足条件while(zero > k){if(nums[left++] == 0){zero--;}}//每次进窗口满足条件的情况下会自动更新,出完窗口下也会自动更新ret = max(ret,right - left + 1);}return ret;}
};

EOF

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

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

相关文章

找不到模块“vue-router”。你的意思是要将 moduleResolution 选项设置为 node,还是要将别名添加到 paths 选项中?

在tsconfig.app.json中添加&#xff0c;记得一定是 tsconfig.app.json 中&#xff0c;如添加到 tsconfig.node.json 还是会报错的 哈哈哈哈&#xff0c;不瞒你们&#xff0c;我就添加错了&#xff0c;哈哈哈。所以这也算写一个demo提醒自己 "compilerOptions": {&qu…

excel如何将多列数据转换为一列?

这个数据整理借用数据透视表也可以做到&#xff1a; 1.先将数据源的表头补齐&#xff0c;“姓名” 2.点击插入选项卡&#xff0c;数据透视表&#xff0c;在弹出对话框中&#xff0c;数据透视位置选择 现有工作表&#xff0c;&#xff08;实际使用时新建也没有问题&#xff09;…

frp内网穿透服务搭建与使用

frp内网穿透服务搭建与使用 1、frp简介 frp 是一个专注于内网穿透的高性能的反向代理应用&#xff0c;支持 TCP、UDP、HTTP、HTTPS 等多种协议。 可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。frp工作原理 服务端运行&#xff0c;监听一个主端口…

C#修改默认参数settings文件

右击项目在设置中进行修改&#xff1a; 千万不要在这里改。 如果要在自己的项目里添加这个文件&#xff0c;首先新建个文件夹&#xff0c;然后添加.setting文件&#xff0c;然后再像上面说的那样添加属性。

【刷题篇】双指针(一)

文章目录 1、移动零2、复写零3、快乐数4、盛最多水的容器 1、移动零 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 class Solution { pub…

免收隔夜费的外汇平台特点与选择

外汇交易是一种全球范围内的投资活动&#xff0c;参与者包括银行、机构投资者、交易商和个人交易者。在外汇交易中&#xff0c;隔夜费&#xff08;也称为掉期费或展期费&#xff09;是当持仓过夜时&#xff0c;因货币对利率差异而产生的费用。这种费用对一些交易者&#xff0c;…

asp.net成绩查询系统

说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于asp.net架构和sql server数据库 功能模块&#xff1a; asp.net成绩查询系统 学生功能有查看成绩和修改账号密码等 后台管理员可以进行用户管理 管理员添加管理员查询注…

[译]Elasticsearch _source Doc_values And Store Performance

原文地址 https://sease.io/2021/02/field-retrieval-performance-in-elasticsearch.html 在这篇博文中&#xff0c;我想从性能的角度探讨 Elasticsearch 为我们存储字段和查询时检索字段提供了哪些可能性。 事实上&#xff0c;Lucene&#xff08;Elasticsearch 和 Solr 构建的…

TriCore TC162 Archievture Volume 笔记

说明 本文是 英飞凌 架构文档 TriCore TC162P core archiecture Volume 1 of 2 (infineon.com) 的文笔&#xff0c;稍作整理方便查阅&#xff0c;错误之处&#xff0c;还请指正&#xff0c;谢谢 :) 1. Architecture 2. General Purpose & System Register 名词列表&#…

一键解密,网络安全神器现已问世!

一、简介 当前版本V1.1这款工具是一款功能强大的网络安全综合工具&#xff0c;旨在为安全从业者、红蓝对抗人员和网络安全爱好者提供全面的网络安全解决方案。它集成了多种实用功能&#xff0c;包括解密、分析、扫描、溯源等&#xff0c;为用户提供了便捷的操作界面和丰富的功…

19.删除链表的倒数第N个结点

给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&#xff1a;[]示例 3&#xff1a;…

Day 24 数据库管理及数据类型

数据库管理及数据类型 一&#xff1a;数据类型 1.数值类型 整数类型 ​ 整数类型&#xff1a;TINYINT SMALLINT MEDIUMINT INT BIGINT ​ 作用&#xff1a;用于存储用户的年龄、游戏的Level、经验值等 浮点数类型 ​ 浮点数类型&#xff1a;FLOAT DOUBLE ​ 作用&#xf…