算法打卡第三天/滑动窗口算法
一今日学习任务第 3 天 滑动窗口算法 209. 长度最小的子数组题目建议 本题关键在于理解滑动窗口这个滑动窗口看文字讲解 还挺难理解的建 议大家先看视频讲解。题目链接https://leetcode.cn/problems/minimum-size-subarray-sum/视频讲解https://www.bilibili.com/video/BV1tZ4y1q7XE二初次解题思路和思考刚拿到这道题第一反应就是最直白的暴力解法用两层for循环枚举所有可能的子数组起点和终点计算子数组的和找到满足和≥target的最小长度。这种方法逻辑简单写起来没难度但时间复杂度高达O(n²)数组稍大就会超时完全不是最优解。再仔细想题目要求在原数组上操作不能用额外空间还得高效那肯定就是用滑动窗口法了。滑动窗口的核心就是用两个指针维护一个窗口一次遍历就完成所有计算直接把时间复杂度从O(n²)降到O(n)完美符合要求。三写代码时核心注意点我最容易搞混的就是窗口的移动逻辑和边界条件总结了几个关键要点1. 两个指针到底干嘛用◦ 左指针窗口的左边界代表当前窗口的起始位置◦ 右指针窗口的右边界用来扩张窗口遍历整个数组◦ sum变量记录当前窗口内所有元素的和2. 什么时候移动指针◦ 右指针一直往后走不断把元素加入窗口扩张窗口◦ 当窗口内的和sum ≥ target时尝试收缩左边界左指针右移直到sum target同时记录过程中的最小长度◦ 核心逻辑窗口只向右移动不回退保证了O(n)的时间复杂度3. 暴力法的坑◦ 暴力法中两层循环的边界很容易写错而且对于大数组会直接超时只能作为理解题意的基础写法◦ 容易忽略子数组长度的初始值设置导致结果错误四操作测试示例输入target 7, nums [2,3,1,2,4,3]输出2解释子数组 [4,3] 是该条件下长度最小的子数组输入target 4, nums [1,4,4]输出1解释子数组 [4] 满足和为4长度最小输入target 11, nums [1,1,1,1,1,1,1,1]输出0解释没有满足条件的子数组五今天收获1. 滑动窗口是解决「连续子数组」问题的核心技巧能大幅优化时间复杂度必须吃透2. 暴力法适合练手但面试一定要用滑动窗口体现算法思维3. 滑动窗口的核心是窗口只向右移动左指针不会回退这是O(n)时间复杂度的关键4. 遇到「连续子数组求和」「最小/最大长度子数组」这类问题第一反应就该想到滑动窗口5. 处理边界条件时一定要注意初始值的设置比如result初始为INT_MAX避免结果错误