滑动窗口经典入门题-——长度最小子数组

文章目录

  • 算法原理
  • 题目解析
  • 暴力枚举法的代码
  • 优化
    • 第一步初始化
    • 第二步right右移
    • 第三步left右移
  • 滑动窗口法的代码

算法原理

滑动窗口是一种在序列(例如数组或链表)上解决问题的算法模式。它通常用于解决子数组或子字符串的问题,其中滑动窗口表示一个范围,这个范围在序列上移动,以便找到满足特定条件的子数组或子字符串。

算法的基本思想是维护两个指针,通常是左右两个指针,表示滑动窗口的左右边界。通过调整这两个指针,可以滑动窗口在序列上移动。在每个窗口位置,都可以根据问题的要求进行处理,比如计算窗口内的和、最大值、最小值,或者检测满足某些条件的子数组或子字符串等。

滑动窗口算法的一般步骤如下:

初始化左右指针: 将左指针和右指针初始化为序列的起始位置。

滑动窗口: 移动右指针以扩大窗口,或移动左指针以缩小窗口,直到满足问题的条件。

处理窗口数据: 在每个窗口位置,根据问题的要求处理窗口内的数据,比如计算窗口内的和、最大值、最小值,或者检测满足某些条件的子数组或子字符串。

更新结果: 根据问题的要求更新结果。

重复: 重复2-4步骤,直到右指针到达序列的末尾。

滑动窗口算法通常能够在线性时间内解决一些与子数组或子字符串相关的问题,因为每个元素至多被访问两次(一次由左指针,一次由右指针)。这种算法的时间复杂度通常是 O(N),其中 N 是序列的长度。

实际应用中,滑动窗口算法可以解决一系列问题,如最大子数组和、最小覆盖子串、最长无重复字符子串等。

题目解析

废话不多说先上题目链接leetcode—长度最小子数组
那么接下来我们一起解析一下例题如下图
在这里插入图片描述
首先最重要的肯定是读懂题目,题目意思其实也很容易读懂意思就是给我们一个数字target和一个数组,要求在这个数组中找到一个必须是连续的子数组并且这个子数组每个元素加起来>=target并从找到的这些数组中取一个最短的数组那么炸一看可能会感觉有些茫然,但是学习算法我们要记住一个步骤就是面对一个题目的时候先想一下如何暴力的把他求出来,那么很简单那就是找到所有的子数组并从这些子数组中找到和>=target的数组之后取得最小值那么我们把暴力的方法先写出来代码如下

暴力枚举法的代码

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int ans=0x9f9f9f;
        for(int i=0;i<nums.size();i++)
        {
            int t=0;
            for(int j=i;j<nums.size();j++)
            {
                t+=nums[j];
                if(i==j)
                {
                    if(t>=target)
                    {
                        ans=min(ans,j-i+1);
                        break;
                    }
                }
                if(t>=target)
                {
                    ans=min(ans,j-i+1);
                    break;
                }
            }
        }
        if(ans==0x9f9f9f)
        {
            return 0;
        }
        return ans;
    }
};

在这里插入图片描述

由于力扣的后台测试数据比较小所以这个暴力的解法也可以过但是我们可以清楚的看到这个算法的时间复杂度达到了O(n^2)因此这个时间负责度还是比较高的因此我们有没有更简单的办法呢?

优化

使用滑动窗口进行优化,
在这道题目中我们可以看到两个重要信息

1、子数组必须是连续的
2、子数组的和需要>=target

那么我们可以想一下我们可以使用两个指针一个是left一个是right当left和right之间的元素和小于target的时候就让right一直向右移动,当right和left之间的元素大于等于target的时候我们更新一下此时的长度是否为最短,然后再让left左移查看此时right和left的元素之和是否大于等于target如果是就继续上一步操作即继续更新我们的最短长度,一直到right和left之间的数据小于target为止之后再让right指针右移即可。
我给大家举出一个例子说明一下。

第一步初始化

在这里插入图片描述

第二步right右移

在这里插入图片描述
此时我们可以发现right和left之间的元素和超过了target因此我们与目标值进行比较取得较小的那个然后让left右移之后再进行查看此时right和left之间的元素和是否大于等于target。

第三步left右移

在这里插入图片描述
此时我们右移后发现right和left之间的元素和小于target因此right继续右移然后后续一直重复这个操作即可

滑动窗口法的代码

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

在这里插入图片描述
我们可以从用时分布图清楚的看到我们的时间效率有了很大的提升。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Redis】Redis基础

Redis基础 初识Redis 认识NoSQL SQL&#xff1a;结构化查询语言 > 关系型数据库 NoSQL&#xff1a;非关系型数据库 SQL与NoSQL的差异&#xff1a; 数据结构 SQL结构化&#xff1a;表的信息依赖于表的结构NoSQL非结构化&#xff1a;存储的信息为KV形式 数据关联 SQL关联…

Android NDK Crash信息收集捕获和日志异常定位分析(addr2line)

Android NDK 闪退日志收集与分析 我们在开发过程中,Android JNI层Crash问题或者我们引用的第三方.so库文件报错,都是一个比较头疼的问题。相对Java层来说,由于c/c++造成的crash没有输出如同Java的Exception Strace堆栈信息,所以定位问题也是个比较艰难的事情。 Google Br…

Nomogram文献分析:提取数据

前言 今天教大家如何分析Nomogram类型的文章&#xff0c;并使用我们开发的系统零代码提取数据。 系统地址&#xff1a;https://clinicaldata.fun/ 要分析的文章&#xff1a;https://pubmed.ncbi.nlm.nih.gov/36504658/ 。这是一篇典型的mimic-iii数据分析的套路&#xff0c;…

智能小程序开发项目步骤流程

快速开始 在开发小程序之前&#xff0c;请确保电脑上已经安装node运行环境。可前往Node.js官网(opens in a new tab)下载安装。智能小程序环境搭建和面板小程序一致&#xff0c;请参考面板小程序搭建环境指南。 开发小程序的流程&#xff1a; 使用涂鸦开发者 IoT 账号登录 T…

c语言-结构体内存对齐

文章目录 前言一、结构体内存对齐总结 前言 本篇文章介绍结构体内存对齐。 一、结构体内存对齐 定义两个结构体&#xff1a; struct S1 {char c1;int i;char c2; };struct S2 {char c1;char c2;int i; }; //输出结构体大小 int main() {printf("%u\n", sizeof(st…

未来能源转型之路:2023年第十三届中国国际储能大会启示录

在2023年第十三届中国国际储能大会上&#xff0c;全球各地的能源专家、学者和企业代表齐聚一堂&#xff0c;共同探讨了储能技术在推动能源转型中的重要作用。对于我们普通人来说&#xff0c;从这场大会中可以学到什么呢&#xff1f; 一、储能技术是未来能源发展的关键 随着可再…

李沐《动手学深度学习》线性神经网络 softmax回归

系列文章 李沐《动手学深度学习》预备知识 张量操作及数据处理 李沐《动手学深度学习》预备知识 线性代数及微积分 李沐《动手学深度学习》线性神经网络 线性回归 目录 系列文章一、softmax回归&#xff08;一&#xff09;问题背景&#xff08;二&#xff09;网络架构&#xf…

win11启动docker desktop报错 docker desktop unexpected wsl error

win11启动docker desktop报错 docker desktop unexpected wsl error 解决方式&#xff0c; 第一步&#xff1a;控制面板-启动或关闭windows功能窗口勾选下面两个框框 第二步&#xff1a;执行我下面这些命令&#xff0c;不需要重启电脑

Linux:shell脚本:基础使用(7)《exit和break》

exit是结束脚本&#xff0c;不论在脚本任何地方使用&#xff0c;这个脚本就会立马结束&#xff0c;不会继续执行后面的所有命令 break 是结束循环&#xff0c;break只能在循环中使用&#xff0c;并且只对距离自己最近的循环生效&#xff0c;如果循环嵌套循环那么break在哪个循环…

js菜单隐藏显示

1、树状结构对应的表: 2、生成menulist的SQL语句 select {"id":"MenuID","parent":"ParentID","FirstLvMenu":"FirstLvMenu", "text":"MenuName","url":"MenuUrl",&quo…

Linux基础命令和文件操作理解

1.基础命令 快捷键 ctrl alt t 打开终端 ctrl e 跳转终端输入的末尾 ctrl u 清除一行的命令数据 ctrl a 跳转到终端命令开头 ctrl l 清除整个屏幕&#xff0c;不包括当前行 ctrl r 搜索命令 开启历史模式 寻找最近记录的命令&#xff1a;↑ ↓ 移动光标位置 &#xff1a;← →…

游戏《泰坦陨落2》msvcr120.dll丢失的多种解决方法分享

在Windows 11操作系统环境下&#xff0c;众多玩家在体验《泰坦陨落2》这款备受瞩目的射击游戏时&#xff0c;遭遇了一个令人困扰的技术问题&#xff1a;系统提示缺失msvcr120.dll文件。这一关键的动态链接库文件对于游戏的正常运行至关重要&#xff0c;它的缺失直接导致了《泰坦…

拿出最少数目的魔法豆

说在前面 &#x1f388;不知道大家对于算法的学习是一个怎样的心态呢&#xff1f;为了面试还是因为兴趣&#xff1f;不管是出于什么原因&#xff0c;算法学习需要持续保持。 题目描述 请你从每个袋子中 拿出 一些豆子&#xff08;也可以 不拿出&#xff09;&#xff0c;使得剩…

基于Python+django影片数据爬取与数据分析设计与实现

目录 一、 前言介绍&#xff1a; 二 、功能设计&#xff1a; 三、功能实现&#xff1a; 系统登录实现 管理员实现 用户模块实现 四、库表设计&#xff1a; 五、关键代码&#xff1a; 六、论文参考&#xff1a; 七、其他案例&#xff1a; 八、源码获取&#xff1a; 一…

fastJson和jackson的日期数据处理

目录 1.jackson 2.fastjson 3.总结 1.jackson jackson是spring mvc默认的JSON解析方法&#xff0c;前端的数据序列化处理之后&#xff0c;后端经过反序列化处理可以直接使用实体对象进行接收。后端接口返回实体对象&#xff0c;经过序列化处理后前端可以接收并进行处理。 …

目标检测--02(Two Stage目标检测算法1)

Two Stage目标检测算法 R-CNN R-CNN有哪些创新点&#xff1f; 使用CNN&#xff08;ConvNet&#xff09;对 region proposals 计算 feature vectors。从经验驱动特征&#xff08;SIFT、HOG&#xff09;到数据驱动特征&#xff08;CNN feature map&#xff09;&#xff0c;提高特…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例4-4 label

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>label</title> </head><body> 性别: <label for"male">男</label> <input type"radio" name"sex&quo…

多输入多输出 | Matlab实现基于LightGBM多输入多输出预测

多输入多输出 | Matlab实现基于LightGBM多输入多输出预测 目录 多输入多输出 | Matlab实现基于LightGBM多输入多输出预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现基于LightGBM多输入多输出预测&#xff08;完整源码和数据&#xff09; 1.data为数据集&a…

java多线程(线程池)

1、创建一个可缓存线程池&#xff0c;如果线程池长度超过处理需要&#xff0c;可灵活回收空闲线程&#xff0c;若无可回收&#xff0c;则新建线程。 public static void main(String[] args) {ExecutorService cachedThreadPool Executors.newCachedThreadPool();for (int i …

npm换源

检查现在的源地址 npm config get registry 使用淘宝镜像 npm config set registry https://registry.npm.taobao.org 使用官方镜像 npm config set registry https://registry.npmjs.org/