滑动窗口(1)_长度最小的子数组

个人主页:C++忠实粉丝
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C++忠实粉丝 原创

滑动窗口(1)_长度最小的子数组

收录于专栏【经典算法练习
本专栏旨在分享学习C++的一点学习笔记,欢迎大家在评论区交流讨论💌

 

目录

1. 题目链接:

2. 题目描述 :

3. 解法 :

    解法一(暴力枚举) :

    算法思路 :

    具体步骤:

    代码展示 :

    结果分析 :

    解法二(滑动窗口) :

   滑动窗口简介

   算法思路 :

    图解流程 :

    代码展示 :

    结果分析 :

滑动窗口的正确性:

时间复杂度分析: 

4. 总结 :


1. 题目链接:

OJ链接-----长度最小的子数组

2. 题目描述 :

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其总和大于等于 target 的长度最小的 

子数组

 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度如果不存在符合条件的子数组,返回 0 。

示例 1:

输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4, 3]是该条件下的长度最小的子数组。

示例 2:

输入:target = 4, nums = [1,4,4]
输出:1

示例 3:

输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0

提示:

  • 1 <= target <= 10^9
  • 1 <= nums.length <= 10^5
  • 1 <= nums[i] <= 10^5

3. 解法 :

    解法一(暴力枚举) :

    算法思路 :

[从前往后]枚举数组中的任意一个元素,把它当成起始位置.然后从这个[起始位置]开始,寻找一段最短的区间,使得这段区间的和[大于等于]目标值.

将所有元素作为起始位置所得的结果中,找到[最小值]即可.

 具体步骤:

  1. 用i, j两层循环遍历完整个数组
  2. 用sum统计[i, j]区间之和
  3. 如果sum >= target, 说明j没有移动的必要(数组内全是正整数)就让i移动
  4. 移动前更新一下最小长度len

 

    代码展示 :

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

 

    结果分析 :

还是一样,分析题目给的数据范围:

题目给的数据范围: 

  • 1 <= target <= 10^9
  • 1 <= nums.length <= 10^5
  • 1 <= nums[i] <= 10^5

也就是说我们数组中的数的个数是在[0, 10^5]之内,而我们的暴力算法时间复杂度为O(N^2),

数据级别为10^10 > 10^9,所以会超出时间限制!!!

    解法二(滑动窗口) :

   滑动窗口简介

滑动窗口是一种在处理序列(如数组或字符串)问题时的算法技术。它通过定义一个“窗口”在序列上滑动,以动态调整和计算子序列的属性,而无需重新计算整个序列。窗口的大小可以是固定的,也可以是动态调整的。

基本步骤:

初始化窗口:设置窗口的起始位置。
扩展窗口:根据问题需求,扩展窗口(例如,右移)。
更新窗口:在窗口范围内执行所需操作(如求和、计数等)。
缩小窗口:根据条件(如窗口太大),调整窗口(例如,左移)。
重复步骤:直到窗口遍历完整个序列。
这种方法提高了效率,尤其是在需要处理大量数据时。 

   算法思路 :

由于此问题分析的对象是[一段连续的区间], 因此可以考虑[滑动窗口]的思想来解决这道题.

让滑动窗口满足: 从i位置开始,窗口内所有元素的和小于target(那么当窗口内元素之和第一次大于等于目标值的时候,就是i位置开始,满足条件的最小长度).

做法: 将右端元素划入窗口中,统计出此时窗口内元素的和:

        如果窗口内元素之和大于等于target: 更新结果,并且将左端元素划出去的同时继续判断是否满足条件并更新结果(因为左端元素可能性很小,划出去之后依旧满足条件)

        如果窗口内的元素之和不满足条件: rihgt++,另下一个元素进入窗口.

    图解流程 :

 

 

 

         

 

 

    代码展示 :

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int len = INT_MAX, n = nums.size(), sum = 0;for(int right = 0, left = 0; right < n; right++){sum += nums[right];while(sum >= target){len = min(len, right - left + 1);sum -= nums[left++];}}return len == INT_MAX ? 0 : len; }
};

 

    结果分析 :

滑动窗口的正确性:

这个窗口寻找的是: 以当前窗口最左侧元素(记为left1)为基准,符合条件的情况.也就是在这道题中,从left1开始,满足区间和sum >= target时的最右侧(记为right1)能到哪里.

我们既然已经找到从left1开始的最优的区间,那么就就可以大胆舍去left1.但是如果继续像方法一(暴力枚举)一样,重新开始统计第二个元素(left2)往后的和,势必会有大量重复的计算(因为我们在求第一段区间的时候),已经算出很多元素的和了,这些和可以在计算下次区间和的时候用上的).(就像一个滑动的区间记录这我们已经求过的值)

此时,right1的作用就体现出来了,我们只需将left1这个值从sum中剔除.从right1这个元素开始,往后找满足left2元素的区间(此时right也有可能满足的.因为left1可能很小.sum剔除掉left1

之后,依旧满足大于等于target).这样我们就能省掉大量重复的计算.

这样我们不仅能解决问题,而且就能省掉大量重复的计算

时间复杂度分析: 

虽然代码时是两层循环,但是我们的left指针和right指针都是不会退的,两者最多都往后移动n次.因此时间复杂度是O(N).

4. 总结 :

滑动窗口这这道题中就是利用单调性,使用"同向双指针"来优化我们的暴力算法,就像一个滑动的窗口一样,记录这我们计算过的数.

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

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

相关文章

一款高效、简洁的帧动画生成工具

在现代网页设计和移动应用开发中&#xff0c;帧动画是一种常见的动画实现方式&#xff0c;它通过连续显示一系列静态图片来模拟动画效果。然而&#xff0c;手动创建和管理这些帧动画图片不仅耗时费力&#xff0c;而且效率低下。为此&#xff0c;gka 应运而生&#xff0c;它是一…

Java学习Day41:骑龙救!(springMVC)

springMVC与sevlet都是对应表现层web的&#xff0c;但是越复杂的项目使用SpringMVC越方便 基于Java实现MVC模型的轻量级web框架 目标&#xff1a; 小案例&#xff1a; 1.导入依赖 spring-context: 提供 Spring 框架的核心功能&#xff0c;如依赖注入、事件发布和其他应用上…

无人机之伯努利定律

无人机的伯努利定律是解释无人机飞行原理的关键理论之一&#xff0c;它主要阐述了流体&#xff08;如空气&#xff09;在流动过程中速度与压力之间的关系。以下是对无人机伯努利定律的详细解释&#xff1a; 一、伯努利定律的基本原理 伯努利定律是流体力学中的一个基本原理&am…

【python】—— Python爬虫实战:爬取珠海市2011-2023年天气数据并保存为CSV文件

目录 目标 准备工作 爬取数据的开始时间和结束时间 爬取数据并解析 将数据转换为DataFrame并保存为CSV文件 本文将介绍如何使用Python编写一个简单的爬虫程序,以爬取珠海市2011年至2023年的天气数据,并将这些数据保存为CSV文件。我们将涉及到以下知识点: 使用r…

Word 脚注与正文之间的空行怎么删除啊?

全网都搜索不到解决方案&#xff0c;难道只有我一个人遇到这个问题了吗&#xff1f; 无语&#xff0c;。、;

Java导入、导出excel保姆级教程(附封装好的工具类)

前言 我们在日常开发中&#xff0c;一定遇到过要将数据导出为Excel的需求&#xff0c;那么怎么做呢&#xff1f;在做之前&#xff0c;我们需要思考下Excel的组成。Excel是由四个元素组成的分别是&#xff1a;WorkBook(工作簿)、Sheet(工作表)、Row(行)、Cell(单元格)&#xff…

linux入门到实操-1 Linux概述、诞生过程、发行版本,如何安装?

教程来源&#xff1a;B站视频BV1WY4y1H7d3 3天搞定Linux&#xff0c;1天搞定Shell&#xff0c;清华学神带你通关_哔哩哔哩_bilibili 整理汇总的课程内容笔记和课程资料&#xff0c;供大家学习交流下载&#xff1a;夸克网盘分享 本文内容为完整笔记的入门篇 概述部分历史内容…

使用LSTM(长短期记忆网络)模型预测股票价格的实例分析

一&#xff1a;LSTM与RNN的区别 LSTM&#xff08;Long Short-Term Memory&#xff09;是一种特殊的循环神经网络&#xff08;RNN&#xff09;架构。LSTM是为了解决传统RNN在处理长序列数据时遇到的梯度消失或梯度爆炸问题而设计的。 在传统的RNN中&#xff0c;信息通过隐藏状…

使用虚拟信用卡WildCard轻松订阅POE:全面解析平台功能与订阅方式

POE&#xff08;Platform of Engagement&#xff09;是一个由Quora推出的人工智能聊天平台&#xff0c;汇集了多个强大的AI聊天机器人&#xff0c;如GPT-4、Claude、Sage等。POE提供了一个简洁、统一的界面&#xff0c;让用户能够便捷地与不同的AI聊天模型进行互动。这种平台的…

基于SpringBoot的社团管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于JavaSpringBootVueMySQL的社团管理系统【附源码文档】、…

HashTable哈希表

概念 散列表(Hash Table)&#xff0c;又称哈希表。是一种数据结构&#xff0c;特点是:数据元素的关键字与其存储地址直接相关 在顺序结构以及树型结构中&#xff0c;数据元素的关键字与其存储位置没有对应的关系&#xff0c;因此在查找一个元素时&#xff0c;必须要经过关键码…

Windows 平台安装 Nacos 2.x

环境准备 64 位操作系统&#xff0c;Windows 10 / Linux Centos 7JDK 1.8 安装包下载 安装包下载官方地址&#xff1a;https://github.com/alibaba/nacos/releases 启动 将安装包解压到安装的目录下&#xff0c;改名为 nacos-2.0.4。然后进行到 bin 目录下&#xff0c;打开…

软件测试服务公司出具第三方软件测试报告流程和周期简析

随着信息技术的飞速发展&#xff0c;软件已成为各行各业不可或缺的重要工具。然而&#xff0c;软件的质量直接影响到企业的效率和用户体验&#xff0c;因此&#xff0c;软件测试服务的重要性日益凸显。软件测试服务公司&#xff0c;顾名思义&#xff0c;就是专门提供专业的软件…

工业机器人9公里远距离图传模块,无人机低延迟高清视界,跨过距离限制

在科技日新月异的今天&#xff0c;无线通信技术正以未有的速度发展&#xff0c;其中&#xff0c;图传模块作为连接现实与数字世界的桥梁&#xff0c;正逐步展现出其巨大的潜力和应用价值。今天&#xff0c;我们将聚焦一款引人注目的产品——飞睿智能9公里远距离图传模块&#x…

LiveKit的agent介绍

概念 LiveKit核心概念&#xff1a; Room&#xff08;房间&#xff09;Participant&#xff08;参会人&#xff09;Track&#xff08;信息流追踪&#xff09; Agent 架构图 ​ 订阅信息流 ​ agent交互流程 客户端操作 加入房间 房间创建方式 手动 赋予用户创建房间的…

JavaScript - Api学习 Day03 (日期对象、节点操作、两种定时器、本地存储)

文章目录 一、日期对象1.1 实例化1.2 日期对象方法 二、节点操作2.1 父子兄弟节点1. 父节点查找2. 子节点查找3. 兄弟关系查找 2.2 增删节点1. 创建节点 - createElement2. 添加节点2.1 appendChild() 方法2.2 insertBefore() 方法2.3. 克隆节点 - cloneNode 3. 删除节点3.1 re…

[数据集][目标检测]抽烟检测数据集VOC+YOLO格式22559张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;22559 标注数量(xml文件个数)&#xff1a;22559 标注数量(txt文件个数)&#xff1a;22559 标…

VisualStudio环境搭建C++

Visual Studio环境搭建 说明 C程序编写中&#xff0c;经常需要链接头文件(.h/.hpp)和源文件(.c/.cpp)。这样的好处是&#xff1a;控制主文件的篇幅&#xff0c;让代码架构更加清晰。一般来说头文件里放的是类的申明&#xff0c;函数的申明&#xff0c;全局变量的定义等等。源…

echarts图 图例跑上面去了 不在右边

legend 中缺少 "right": "1%", "top": "center",

PyTorch----模型运维与实战

一、PyTorch是什么 PyTorch 由Facebook开源的神经网络框架&#xff0c;专门针对 GPU 加速的深度神经网络&#xff08;DNN&#xff09;编程。 二、PyTorch安装 首先确保你已经安装了GPU环境&#xff0c;即Anaconda、CUDA和CUDNN 随后进入Pytorch官网​​​​​​PyTorch 官…