【算法】滑动窗口——最大连续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://xiahunao.cn/news/3016682.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

类加载器aa

一&#xff0c;关系图及各自管辖范围 &#xff08;不赘述&#xff09; 二&#xff0c;查看关系 package com.jiazai;public class Main {public static void main(String[] args) {ClassLoader appClassLoader ClassLoader.getSystemClassLoader();//默认System.out.println…

RAG 修炼手册|揭秘 RAG 时代的新向量数据库

随着对大型模型应用探索的深入&#xff0c;检索增强生成技术&#xff08;Retrieval-Augmented Generation&#xff09;受到了广泛关注&#xff0c;并被应用于各种场景&#xff0c;如知识库问答、法律顾问、学习助手、网站机器人等。 不过&#xff0c;有很多朋友对于向量数据库和…

【热门话题】实用Chrome命令:提升前端开发效率的利器

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 实用Chrome命令&#xff1a;提升前端开发效率的利器引言目录1. 快速打开Chrome …

246 基于matlab的交流电机动态方程

基于matlab的交流电机动态方程&#xff0c;用于交流电机动态分析。输入电机的额定功率(kW)、电机的额定转速(r/min)、转子外径(m)、铁心长(m)转子槽数、电机极对数 等参数&#xff0c;输出转速变化、力矩变化等结果。程序已调通&#xff0c;可直接运行。 246 交流电机动态 转速…

深度强化学习框架Acme【一】

Acme学习笔记&#xff08;一&#xff09; Chapter 2 RLOnline Reinforcement LearningOffline Reinforcement LearningImitation LearningLearning from Demonstrations Chapter 3 Acme3.1 Environments and environment loops3.2 Actors3.3 Experience replay and data storag…

Backblaze发布2024 Q1硬盘故障质量报告-2

截至2024年第一季度末&#xff0c;我们正在跟踪279,572块正在运行的硬盘。硬盘型号在2024年第一季度末必须拥有500块或更多的硬盘&#xff0c;并在整个使用寿命期间累积超过100,000个硬盘工作日&#xff0c;达到这个条件的所有型号盘的故障率趋势表现如下&#xff1a; 除了三种…

后仿中必须读懂的User-defined primitives(UDP)

一 UDP定义规则 UDP&#xff0c;全名&#xff1a;User-defined primitives。 用户自己定义的原语。 UDP可分为&#xff1a;combinational UDP&#xff08;组合逻辑&#xff09;和 sequential UDP&#xff08;时序逻辑&#xff09;。 1.1 组合逻辑UDP combinational UDP用于…

02-Fortran基础--Fortran操作符与控制结构

02-Fortran基础--Fortran操作符与控制结构 0 引言1 操作符1.1 数学运算符1.2 逻辑运算符1.3 关系运算符 2 控制流程2.1 条件结构2.2 循环结构2.3 分支结构 0 引言 运算符和控制流程对编程语言是必须的,Fortran的操作符和控制流程涉及到各种数学运算符、逻辑运算符以及控制结构。…

《十九》Qt Http协议及实战

前言 本篇文章来给大家讲解QT中的Http协议&#xff0c;Http协议主要用于网络中数据的请求和响应&#xff0c;那么这篇文章将给大家讲解一下这个协议。 一、HTTP概述 HTTP&#xff08;超文本传输协议&#xff09;是互联网上应用最为广泛的协议之一&#xff0c;它定义了客户端…

linux 调试-kdb 调试内核-1

目标&#xff1a;打印bcm2835_spi_transfer_one 是如何从用户空间开始调用的 1. kernel 配置 KDB配置选项 添加 spi 控制器驱动 和 spi 设备驱动 2. 调试流程 调试内核-系统启动之后 1. 开发板进入kdb,等待pc 连接 rootraspberrypi:~# echo "ttyS0,115200"…

《ESP8266通信指南》12-Lua 固件烧录

往期 《ESP8266通信指南》11-Lua开发环境配置-CSDN博客 《ESP8266通信指南》10-MQTT通信&#xff08;Arduino开发&#xff09;-CSDN博客 《ESP8266通信指南》9-TCP通信&#xff08;Arudino开发&#xff09;-CSDN博客 《ESP8266通信指南》8-连接WIFI&#xff08;Arduino开发…

AIGC技术带给我们什么?基于AIGC原理及其技术更迭的思考

AIGC技术带给我们什么&#xff1f;基于AIGC原理以及技术更迭的思考 前言 AI&#xff0c;这个词在如今人们的视野中出现频率几乎超过了所有一切其他的事物&#xff0c;更有意思的是&#xff0c;出现频率仅次于这个词的&#xff0c;几乎都会加上一个修饰亦或是前缀——AI&#…

SpringBoot3项目打包和运行

六、SpringBoot3项目打包和运行 6.1 添加打包插件 在Spring Boot项目中添加spring-boot-maven-plugin插件是为了支持将项目打包成可执行的可运行jar包。如果不添加spring-boot-maven-plugin插件配置&#xff0c;使用常规的java -jar命令来运行打包后的Spring Boot项目是无法找…

asp.net成绩查询系统

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

成为黑客第一步,应该从熟练掌握运维常见的工具开始

目录 1. 开发工具 2. 自动化构建和测试 3. 持续集成与交付&#xff08;CI/CD&#xff09; 4. 部署工具 5. 维护 6. 监控&#xff0c;警告&分析 1. 开发工具 代码编辑器和IDE&#xff08;集成开发环境&#xff09;&#xff1a;如Visual Studio Code、IntelliJ IDEA和E…

看完这篇文章我奶奶都懂Opentracing了 (二)

二. 概念分析 1. Span和SpanContext 结合上述示例&#xff0c;我们从Span开始入手来进行概念分析&#xff0c;但是说在最前面&#xff0c;Span在不同的分布式链路实现中&#xff0c;其定义是不全一样的&#xff0c;尽管Opentracing已经进行了概念的统一&#xff0c;但是具体到…

QT--2

Qt界面设计 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {//窗口相关设置this->resize(680,520);this->setFixedSize(680,520);this->setWindowTitle("Tim");this->setWindowFla…

在拥有多个同名称密码的ap环境中,如何连接到指定信道或mac的ap路由器?

在给客户做ESP32-C3入墙开关项目时&#xff0c;客户问&#xff1a;在拥有多个同名称密码的ap环境中&#xff0c;如何连接到指定信道或mac的ap路由器&#xff1f;针对这个问题&#xff0c;启明云端工程师给出下面解决方法。 1、将wifi_sta_config_t配置中的channel配置为该信道…

Codeforces Round 942 (Div. 2) A-D1

题目&#xff1a; Codeforces Round 942 (Div. 2) D2有缘再补吧… A. Contest Proposal 题意 两个升序&#xff08;不降&#xff09;的序列a和b&#xff0c;可以在a的任意位置插入任意数&#xff08;要保持升序&#xff09;&#xff0c;使对任意i&#xff0c;有a[i] < b[…

js 图片渐变

1. 点击图片&#xff0c;使其渐变为另一张图片 通过定义keyframes来创建一个淡入淡出的动画效果。当图片被点击时&#xff0c;先添加淡出动画使图片透明度从0渐变到1&#xff0c;然后在1秒后切换图片源并添加淡入动画使新图片透明度从0渐变到1&#xff0c;实现图片渐变效果。 …