【Leetcode每日一刷】滑动窗口:209.长度最小的子数组

news/2024/5/20 9:21:03 标签: leetcode, 算法, 职场和发展, 滑动窗口, c++

一、209.长度最小的子数组

1.1:题目

题目链接
在这里插入图片描述

1.2:解题思路

  • 题型滑动窗口;时间复杂度:O(n)
    🪧 滑动窗口本质也是双指针的一种技巧,特别适用于字串问题

  • ❗❗核心思想/ 关键左右指针滑窗口,一前一后齐头进。
    详细思路建议看前一篇:【Leetcode每日一刷】数组|双指针篇:977. 有序数组的平方、76. 最小覆盖子串(附滑动窗口法详解)

  • 算法框架:注意下面框架中的6个关键点!

    /* 滑动窗口算法框架 */
    void slidingWindow(string s) {
        // ⭐1)用合适的数据结构记录窗口中的数据情况(以便和所需的可行解进行比对)
        unordered_map<char, int> window;
        
        // ⭐2)// 记录最小符合条件子串的起始索引及长度
    	int start = 0, len = INT_MAX; //根据实际算法所需答案进行调整
        
        int left = 0, right = 0;
        while (right < s.size()) {
            // c 是将移入窗口的字符
            char c = s[right];
            window.add(c)
            // 增大窗口
            right++;
            // ⭐3)进行增大窗口后,更新关于记录当前窗口内数据情况的变量(以便稍后和所需的可行解进行比对)
            ...
    
            /*** debug 输出的位置 ***/
            // 注意在最终的解法代码中不要 print
            // 因为 IO 操作很耗时,可能导致超时
            printf("window: [%d, %d)\n", left, right);
            /********************/
            
            // ⭐4)找到可行解——判断左侧窗口是否要收缩(进行更新)
            while (left < right && window needs shrink) {
            	//进入到这个while里面说明找到一个可行解
    			//⭐5)进行最终的所需的答案更新
    			// eg:在这里更新符合条件的*最小*子串(即最终结果)
                if (right - left < len) {
                    start = left;
                    len = right - left;
                }
                // d 是将移出窗口的字符
                char d = s[left];
                window.remove(d)
                // 缩小窗口
                left++;
                // ⭐6)进行缩小窗口后,更新关于记录当前窗口内数据情况的变量(以便稍后和所需的可行解进行比对)
                ...
            }
        }
    }
    
    

    🌟1. 3)6)的操作分别是扩大和缩小窗口后的更新操作,等会你会发现它们操作是完全对称的。作用都是更新当前窗口中的数据情况,再拿去和题目所需的可行解进行比对,判断当前窗口内的情况是否可行!

    🌟2. 5)步也很关键,它的作用是:找到一个可行解&更新得到一个可行解后,对题目最终需要的最优答案进行更新!

  • 本题思路(依据算法框架)

    1. ⭐首先设置一个记录当前窗口情况的变量windowSum(作用是方便与所需可行条件进行比较)——记录当前窗口中元素综合
    2. ⭐设置存储最终答案(窗口长度)的变量(作用是得到可行情况后,进行实时更新,以得到最终的最优答案)
    3. ⭐设置leftright指针对窗口大小进行控制
    4. ⭐在窗口的增大和缩小过程中实时更新记录当前窗口情况的变量windowSum
    5. ⭐在得到可行解的情况下,实时更新最终答案

1.3:实现代码——c++

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
            //设置一个记录当前窗口情况的变量(即当前窗口内元素总和
            int windowSum = 0;
            //算法的最终答案:minLen
            int minLen = INT_MAX;
            int left =0, right = 0;
            while(left <= right && right < nums.size()){
                //先记下窗口待新增元素
                int a = nums[right];
                right++;
                //增大窗口后,更新当前窗口中的情况
                windowSum += a;

                while(left <= right && windowSum >= target){
                    //首先,因为进入循环就代表得到哦一个可行结果,立马更新答案
                    minLen = min(minLen, right - left);
                    //先记下窗口待减少元素
                    int b = nums[left];
                    left++;
                    //窗口减小后,更新记录当前窗口的元素
                    windowSum -= b;
                }
            }
            return minLen == INT_MAX ? 0 : minLen;
    }
};

http://www.niftyadmin.cn/n/5419676.html

相关文章

SpringCloud2023最新版本该如何进行组件选型?

前言 Developing distributed systems can be challenging. Complexity is moved from the application layer to the network layer and demands greater interaction between services. Making your code ‘cloud-native’ means dealing with 12-factor issues such as exte…

操作系统笔记(进程)

注&#xff1a; 下面图片资源来源于 王道计算机考研 操作系统 1.进程概念 进程&#xff08;process&#xff09;&#xff1a;是动态的&#xff0c;是程序的一次执行过程&#xff08;同一程序多次执行&#xff0c;会产生多个进程&#xff09;程序&#xff1a;是静态的&…

聚类简单讲解

聚类任务 聚类任务是指将一组数据分成多个不同的组&#xff08;或簇&#xff09;&#xff0c;使得同一组内的数据点彼此相似&#xff0c;而不同组之间的数据点尽可能不相似的过程。聚类任务的目标是发现数据中的固有结构&#xff0c;而不需要事先知道数据的类别信息。聚类算法…

Long-term Correlation Tracking LCT 目标跟踪算法源码运行

资源 LCT-tracker项目地址VLFeat官网OpenCV下载地址OTB50数据集百度网盘资源 参考博客 一步一步教你跑lct-tracker&#xff08;Win10Matlab 2016bVisual Studio 2015&#xff09;LCT代码跑起来先文章思路总结 正文 1. 环境配置 我的环境&#xff1a;Win11、Visual Studio…

文件夹图标变白色,数据恢复大揭秘!

一、遭遇困扰&#xff1a;文件夹图标变白色 在日常使用电脑的过程中&#xff0c;我们可能会遇到一个奇怪的现象&#xff1a;原本熟悉的各种颜色和样式的文件夹图标&#xff0c;突然变成了统一的白色。这种变化可能发生在单个文件夹上&#xff0c;也可能影响到整个磁盘或分区中…

记一次kafka消息积压的排查

kafka消息积压报警&#xff0c;首先进行了自查&#xff0c;这个现象频频出现&#xff0c;之前每次都是先重新分配分区或者回溯&#xff08;消息可丢弃防止大量积压消费跟不上&#xff09;。 根据手册首先排查下消息拉取是否正常&#xff0c;看到了消息拉取线程是waiting状态&am…

Spark--一文了解WebUI

文章目录 前言一、认识Spark UI二、Jobs2.1 了解jobs2.2 关于job我们需要知道的小知识2.2.1 多个job可以并行执行吗2.2.2 job是如何划分的2.2.3 job detai中为什么有些stage可以被跳过&#xff08;skipped&#xff09;2.2.4 上游stage的Shuffle Write等于下游stage的 Shuffle R…

WatchBird: 新一代纯PHP防火墙

WatchBird: 新一代纯PHP防火墙 工具安装 广大研究人员可以使用下列命令直接将项目源码克隆至本地 git clone https://github.com/leohearts/awd-watchbird.git工具部署 1.进入下载好的文件夹目录 2.编译waf.c生成.so文件,参考命令:gcc waf.c -shared -fPIC -o waf.so 3.将w…