【C++算法】10.滑动窗口_长度最小的子数组

ops/2025/3/19 23:17:50/

文章目录

    • 题目链接:
    • 题目描述:
    • 解法
    • C++ 算法代码:
    • 图解


题目链接:

209. 长度最小的子数组


题目描述:

1170422f911c06f1e598ea59a29ecac5


解法

解法一:暴力求解(会超时)

暴力枚举出所有子数组的和。

查找子数组n2,求和n

一共O(n3)

优化:

求和的时候,可以把上次求和的结果存起来,往后加一位的时候直接把那一位的值加到上次的和里面。

解法二:滑动窗口O(n)

利用单调性,使用同向双指针来优化。(同向双指针也叫滑动窗口)

  1. left=0,right=0,标记窗口的左右端点
  2. 进窗口
  3. 判断,更新结果🌟,出窗口

2-3步是一直循环的

例如:nums=[2,3,1,2,4,3]

bf6f7a41e4c0f24e3385c0f646767131

移动到sum>=target

6534792b2aa1723748d3fa03cddf0bc9

然后left右移,因为如果left不动,right继续往后得到的都不是长度最小的数组了。

aa3c1e36590f6a910fb325c20970fa2b

sum<target,right右移

98dad4dddeee070163985dcba31f6609

依次类推

然后窗口的长度可以用len来记录,每次判断后先更新结果,然后出窗口。


C++ 算法代码:

解法一:暴力求解(会超时)

class Solution {public:int minSubArrayLen(int target, vector<int>& nums) {// 记录结果int ret = INT_MAX;int n = nums.size();// 枚举出所有满足和大于等于 target 的子数组[start, end// 由于是取到最小,因此枚举的过程中要尽量让数组的长度最小// 枚举开始位置for (int start = 0; start < n; start++){int sum = 0; // 记录从这个位置开始的连续数组的和// 寻找结束位置for (int end = start; end < n; end++){sum += nums[end]; // 将当前位置加上if (sum >= target) // 当这段区间内的和满足条件时{// 更新结果,start 开头的最短区间已经找到ret = min(ret, end - start + 1);break;}}}// 返回最后结果return ret == INT_MAX ? 0 : ret;}
};

解法二:

class Solution 
{public:int minSubArrayLen(int target, vector<int>& nums) {int n = nums.size(), sum = 0, len = INT_MAX;for(int left = 0, right = 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;}
};

图解

nums=[2,3,1,2,4,3]

target=7

  1. n=6,sum=0,right=0,left=0,target=7,len=INT_MAX(确保min使用的时候不会把len的初始值当作最小值)

b000e57b75676632dd08955353dcf5f6

  1. sum=2

    sum<target,right++

a26691d21d504806c3bd541f0e84a510

  1. sum=5

    sum<target,right++

88c4dd7832bfdeb9cbaf7889c41dbef0

  1. sum=5

    sum<target,right++

216734ef9302afa8c1e63071380c329f

  1. sum=8

    sum>target,len=4

    sum=sum-nums[left++]=8-2=6

ed97423f50bce4cfa4726e06b66751e7

  1. sum=6

    sum<target,right++

d055ae3daef5ce1fefa302efca207622

  1. sum=10

    sum>target,len=4

    sum=sum-nums[left++]=10-3=7

d80a4ad69c27c089f1261afef6455762

  1. sum=7

    sum=target,len=3

    sum=sum-nums[left++]=7-1=6

973a3fe82a527723d2848853fb0f99cb

  1. sum=6

    sum<target,right++

5b759f03d0c01c3cc4abdd5a1c2a8892

  1. sum=9

    sum>target,len=3

    sum=sum-nums[left++]=9-2=7

328afb03c2ae215109c04c4becc5ddbe

  1. sum=7

    sum=target,len=2

    sum=sum-nums[left++]=7-4=3

bd5301b2ad254ec8435695ecc4437004

  1. sum=3

    sum<target,right++

cc49d00b9fff8a978d8ef4972098214c

  1. 跳出for循环,return len == INT_MAX ? 0 : len;,这里返回2

  2. 程序结束


http://www.ppmy.cn/ops/121670.html

相关文章

TryHackMe 第6天 | Web Fundamentals (一)

这一部分我们要简要介绍以下 Web Hacking 的基本内容&#xff0c;预计分三次博客。 在访问 Web 应用时&#xff0c;浏览器提供了若干个工具来帮助我们发现一些潜在问题和有用的信息。 比如可以查看网站源代码。查看源代码可以 右键 网页&#xff0c;然后选择 查看网站源代码&…

Pikachu-xss防范措施 - href输出 js输出

总体原则&#xff1a; 输入做过滤&#xff0c;输出做转义 过滤&#xff1a;根据业务需要进行过滤&#xff0c;如&#xff1a;输入点要求输入手机号&#xff0c;则只允许输入手机号格式的数字&#xff1b; 转义&#xff1a;所有输出到前端的数据&#xff0c;都根据输出点进行转…

第33次CCF计算机软件能力认证【T1~T3】:词频统计、相似度计算、化学方程式配平

题目概括词频统计枚举相似度计算STL工具&#xff08;tranform()转换大小写&#xff09; 模拟化学方程式配平大模拟高斯消元 1、词频统计 在学习了文本处理后&#xff0c;小 P 对英语书中的 n 篇文章进行了初步整理。 具体来说&#xff0c;小 P 将所有的英文单词都转化为了整数…

IDEA使用技巧

在使用IntelliJ IDEA&#xff08;简称IDEA&#xff09;这类集成开发环境&#xff08;IDE&#xff09;时&#xff0c;掌握一些高效的使用技巧和安装合适的插件可以显著提升开发效率。以下将从IDEA的使用技巧和插件推荐两个方面进行详细阐述。 一、IDEA使用技巧 1. 快捷键操作 …

Flink源码剖析

写在前面 最近一段时间都没有更新博客了&#xff0c;原因有点离谱&#xff0c;在实现flink的两阶段提交的时候&#xff0c;每次执行自定义的notifyCheckpointComplete时候&#xff0c;好像就会停止消费数据&#xff0c;完成notifyComplete后再消费数据&#xff1b;基于上述原因…

79. 单词搜索

思路 每次以当前位置为初始位置开始遍历&#xff0c;看是否找到单词 &#xff08;以官方题解做出&#xff09; v:代表等于work[k]且已走过的位置 d:四个方向 回溯&#xff08;遍历&#xff09;&#xff1a; 匹配不上&#xff1a;终止 找到了&#xff1a;终止&#xff08;先…

C++11中智能指针以及标准模板库 My_string My_stack

My_string.h #ifndef MY_STRING_H #define MY_STRING_H#include <iostream> #include <cstring> #include <stdexcept>using namespace std;template<typename T> class My_string { private:T *ptr; // 指向字符数组的指针int size; /…

Android常用C++特性之std::chrono

声明&#xff1a;本文内容生成自ChatGPT&#xff0c;目的是为方便大家了解学习作为引用到作者的其他文章中。 std::chrono 是 C11 引入的标准库中的时间处理工具&#xff0c;提供了以多种精度进行时间测量、处理和操作的功能。它允许开发者处理时间点&#xff08;time_point&am…