算法笔记--滑动窗口

news2024/11/17 11:48:05

力扣209.长度最小子数组
https://leetcode.cn/problems/minimum-size-subarray-sum/

在这道题中要注意的不仅仅是滑动窗口的问题,更重要的问题是在循环控制中,不恰当的语法使用会导致这道题出现很严重的问题,这导致我做这道题做了很多天,真的很崩溃。

代码问题

先来看一下循环的控制问题,下面是我之前的错误代码实例:

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int left = 0, right = 0;
        int sum = 0;
        int retsize = 0;
        while(right < nums.size())
        {
            if(sum < target)
                sum += nums[right++];
            else
            {
                int size = right - left;
                if(retsize == 0 || retsize > size)
                    retsize = size;
                if(sum > target)
                {
                    while(sum >= target)
                        sum -= nums[left++];
                    int size = right - left + 1;
                    if(retsize > size)
                        retsize = size;
                }
            }
        }
        if(sum > target)
        {
            while(sum >= target)
                sum -= nums[left++];
            int size = right - left + 1;
            if(retsize > size)
                retsize = size;
        }
        return retsize;
    }
};

emmmm,之前写的代码中最主要的问题就在使用while循环的同时,right的移动是在满足条件之后才可以移动,这会导致代码变得非常混乱。
所以在写代码的过程中,最好要保证一个变量是随着循环规律性发生变换,而出些需要特殊处理的情况的时候,再对其进行特殊处理,尽可能保证代码不会很乱而造成越界或者边界的控制问题。
所以修改后的代码如下:

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int left = 0, right = 0;
        int sum = 0;
        int retsize = 0;
        while(right < nums.size())
        {
            sum += nums[right++];
            if (sum >= target)
            {
                while (sum >= target)
                {
                    int size = right - left;
                    if (retsize == 0 || retsize > size)
                        retsize = size;
                    sum -= nums[left++];
                }
            }
        }
        return retsize;
    }
};

滑动窗口问题

滑动窗口问题其实很简单,就上面这道题而言,如果讲这道题设计为暴力枚举的解法,那么时间复杂度为O(n^2),但本质上我们可以利用单调性规避很多没必要的枚举行为:
在这里插入图片描述

起始位置时,right和left两个指针指向同一个位置,left为左边界,right为右边界,之后移动右边界并记录边界范围内的值的总和。
在这里插入图片描述

当right移动到这个位置的时候,范围内的数据总和已经超过target(7),那么right继续向后移动,必定会导致在符合大于target值的基础上而这个范围在继续扩大。那么就可以确定不需要移动right,但是此时总和已经大于target了,所以接下来就要移动left,但是每次移动我们并不知道移动之后是否还满足条件,所以要进行循环判断。

代码就不贴了,上面有可以参考。这道题看起来很简单,但最主要的是循环控制问题,切忌在循环体中使用条件控制循环变量的增减,否则会导致边界很难控制。另外就是滑动窗口问题,滑动窗口利用了单调性,规避了很多没必要的枚举,这是滑动窗口的核心,它决定了哪些题目可以使用滑动窗口,哪些不可以。

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

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

相关文章

亿级数据毫秒级响应?

作为一名深陷在增删改查泥潭中练习时长三年的夹娃练习生&#xff0c;偶尔会因为没有开发任务不知道周报写什么而苦恼。 正愁这周写啥呢&#xff0c;组长过来交代了个跟进第三方公司性能测试报告的工作&#xff0c;我一寻思这活不最好干了吗&#xff0c;正愁不知道周报咋写呢&a…

github上传文件及其问题解决

文章目录 1. github上上传文件夹2. <filename> does not have a commit checked out3. this exceeds GitHubs file size limit of 100.00 MB4. error: src refspec master does not match any 1. github上上传文件夹 首先在github上create a new repository&#xff0c;…

C语言王国探险记之字符串+注释

王国探险记系列 文章目录&#xff08;3&#xff09; 前言 一&#xff0c;什么是字符串呢&#xff1f; 1&#xff0c;那C语言是怎么表示字符串的呢? "hello world.\n" 2&#xff0c;证明字符串的结束标志是一个 \0 的转义字符 3&#xff0c;证明字符串的结束标…

云原生之深入解析Flink on k8s的运行模式与实战操作

一、概述 Flink 核心是一个流式的数据流执行引擎&#xff0c;并且能够基于同一个 Flink 运行时&#xff0c;提供支持流处理和批处理两种类型应用。其针对数据流的分布式计算提供了数据分布&#xff0c;数据通信及容错机制等功能。Flink 官网不同版本的文档flink on k8s 官方文…

linux-2.6.22.6内核网卡驱动框架分析

网络协议分为很多层&#xff0c;而驱动这层对应于实际的物理网卡部分&#xff0c;这也是最底层的部分&#xff0c;以cs89x0.c这个驱动程序为例来分析下网卡驱动程序框架。 正常开发一个驱动程序时&#xff0c;一般都遵循以下几个步骤&#xff1a; 1.分配某个结构体 2.设置该结…

IDEA将java项目打包为jar包

方法 首先在src -> resources目录下建立一个文件夹&#xff0c;然后再在新建文件夹里面建立META-INF文件夹&#xff08;不推荐直接建立META-INF&#xff0c;否则后面打包完的jar包需要手动修改配置&#xff09; 然后点击File -> Project Structure -> Artifacts -&g…

第三章:Faster R-CNN网络详解(《Faster R-CNN: 基于区域提议网络的实时目标检测》)

(目标检测篇&#xff09;系列文章目录 第一章:R-CNN网络详解 第二章:Fast R-CNN网络详解 第三章:Faster R-CNN网络详解 第四章:YOLO v1网络详解 第五章:YOLO v2网络详解 第六章:YOLO v3网络详解 文章目录 系列文章目录技术干货集锦前言一、摘要二、正文分析 1.引入库2.读…

Mysql的逻辑架构_读写锁_事物

概览 一. MySql的逻辑架构1. 逻辑架构图2. 连接管理与安全性 二. 并发控制1. 读写锁2. 锁粒度 三. 事务1. 特性2. 隔离级别3. 死锁4. 事物日志&#xff1f;5.MySql中的事物 mysql最与众不同的特性&#xff1a;存储引擎架构 架构的设计&#xff1a; 将查询处理(Query Processin…

7、注解与自定义注解

1 注解 注解很厉害&#xff0c;它可以增强我们的java代码&#xff0c;同时利用反射技术可以扩充实现很多功能。它们被广泛应用于三大框架底层。 传统我们通过xml文本文件声明方式(如下图,但是XML比较繁琐且不易检查)&#xff0c;而现在最主流的开发都是基于注解方式&#xff0c…

房贷计算器——新增选择还款方式

房贷计算器——新增选择还款方式 #!/usr/bin/env python # coding: utf-8# In[4]: 文字‘房贷计算器’ 文字‘贷款总金额’&#xff1a;输入框 文字‘贷款期限’&#xff1a;输入框 文字‘年利率’&#xff1a;输入框 按钮‘开始计算’ 返回&#xff1a; 月供 总利息 from tki…

【Framework】bindService启动流程

前言 在【Service启动流程之startService】 中&#xff0c;我们已经分析了startService的流程&#xff0c;这篇就继续讲bindService的流程&#xff0c;他们两有很多相似之处。同样&#xff0c;流程图在总结处。 我们在调用bindService方法时候&#xff0c;实际调用的是Contex…

台庆|三联开关怎么接线?

三联开关是一种常见的开关类型&#xff0c;通常用于控制一个电路中的三个不同的电器或灯具。它的用途非常广泛&#xff0c;因此了解如何正确接线是非常重要的。在本文中&#xff0c;我们将详细讨论三联开关的接线方法。 我们先来看看三联开关实物图与线路图&#xff1a; 接下来…

【音视频处理】FFmpeg详解,命令行、源码、编译安装

大家好&#xff0c;欢迎来到停止重构的频道。 本期我们讨论FFmpeg。 这里先提一个问题&#xff0c;FFmpeg命令行功能如此强大&#xff0c;为什么还需要舍近求远地调用库函数呢 &#xff1f; 我们按这样的顺序讨论 &#xff1a; 1、 FFmpeg命令行说明 2、 FFmpeg代码结构…

如何在 JavaScript 中压缩字符串

在 JavaScript 中&#xff0c;可以有范围很广的压缩&#xff0c;比如 gzip 之类的文件压缩等等。 在这里&#xff0c;我们将讨论两种压缩字符串的方法。 最初&#xff0c;我们将重点介绍霍夫曼算法。 稍后&#xff0c;我们将介绍解决任务的 LZString 方法。 在 JavaScript 中使…

主成分分析系列(一)概览及数据为何要中心化

一、概览 主成分分析&#xff08;Principle Component Analysis&#xff0c;PCA&#xff09;算法属于数据降维算法里面的一种。数据降维算法的主要想法是从高维度数据中找到一种结构&#xff0c;这种结构蕴含了数据中的大部分信息&#xff0c;从而将高维数据降维到低维数据&am…

Apikit 自学日记:参数构造器

构造器是测试时系统提供的快速生成请求数据的工具。一般用于快速对数据进行加密和生成随机数值。可在请求参数中某个字段的右侧选择构造器操作&#xff0c;通过构造器生成该字段的参数值。构造器由两种类型的操作组成&#xff1a;设置初始数据和多重操作。 设置初始数据 其中初…

基于C语言的开源csv解析库:MiniCSV使用示例

文章目录 MiniCSV简介官方示例csv文件解析示例CodeBlocks工程下载 MiniCSV简介 之前写了一篇基于C语言字符串操作函数的csv文件解析&#xff1a;C语言解析csv格式文件&#xff0c;本文介绍一个开源简洁的csv解析库的使用&#xff1a;MiniCSV&#xff0c;使用标准C语言设计。 …

Spring Boot 中的 Redis 的数据操作配置和使用

Spring Boot 中的 Redis 的数据操作配置和使用 Redis 是一种高性能的 NoSQL 数据库&#xff0c;它支持多种数据结构&#xff0c;包括字符串、哈希、列表、集合和有序集合。Redis 还提供了丰富的命令&#xff0c;可以对数据进行快速的 CRUD 操作。Spring Boot 是一个基于 Sprin…

数据结构--栈的引用--前中后缀表达式(前部分)

数据结构–栈的引用–前中后缀表达式(前部分) 常见的算数表达式 由三个部分组成: 操作数、运算符、界限符 \color{red}操作数、运算符、界限符 操作数、运算符、界限符 ps:界限符是必不可少的,反映了计算的先后顺序 波兰表达式(让计算机更容易识别的算数表达式) Reverse Po…

高性能分布式缓存Redis(一) 快速实战

一、缓存发展史&缓存分类 1.1、大型网站中缓存的使用 访问量越大&#xff0c;响应力越差&#xff0c;用户体验越差。 引入缓存、示意图如下&#xff1a; 读写策略&#xff1a; Cache Aside Pattern&#xff08;旁路缓存模式&#xff09;Read/Write Through Pattern&am…