双指针——滑动窗口
滑动窗口代码模板
在数组arr中,arr[i…j]为滑动窗口
1 | i,j = 0,-1 #初始时,窗口中不能有元素,右边界为-1 |
LeetCode 209 Minimum Size Subarray Sum
https://leetcode.com/problems/minimum-size-subarray-sum/
题目理解:给定我们一个数字,让我们求子数组之和大于等于给定值的最小长度
Input: s = 7, nums = [2,3,1,2,4,3]
Output: 2
解释:满足子数组和=7的最小长度数组是[4,3],所以output=2
解法1:暴力解法:
遍历所有的连续子数组[i..j],计算其和sum,验证sum>=s,时间复杂度为O(n^3)
最大问题:大量重复计算
解法2:滑动窗口
整个过程保持一个窗口,而这个窗口的长度不是固定的,且不停向前滑动
从i
到j
的一个连续子数组构成滑动窗口
如果当前这个子数组nums[i...j]
中元素的和sum<s的话,则j
向前移动一位,并将nums[j+1]纳入子数组中。j+1不能越界。
j
继续向前移动直到子数组的和sum>s,并记录当前的i
和j
之间的距离(子数组长度)
随后从i
端缩小这个连续子数组。
注意:代码实现时,要先是移除i
所指元素,再进行i++
直到sum<s,此时j
又可以继续前进,去寻找下一个符合条件的连续子数组。左边界不越界就能一直滑下去。
代码实现
注意:这个窗口是前闭后闭的区间,初始时不能有任何元素,因此j需要从-1开始
1 | class Solution: |
其他例题
子数组类题目
序号 | 题目 | 难度 | 代码 |
---|---|---|---|
78 | Subsets | medium | python、java、c++ |
90 | Subsets II | medium | python、java、c++ |
53 | Maximum Subarray | easy | python、java、c++ |
152 | Maximum Product Subarray | medium | python、java、c++ |
239 | Sliding Window Maximum | hard | python、java、c++ |
295 | Find Median from Data Stream | hard | python、java、c++ |
228 | Summary Ranges | medium | python、java、c++ |
163 | Missing Ranges | medium | python、java、c++ |
325 | Maximum Size Subarray Sum Equals k | medium | python、java、c++ |
209 | Minimum Size Subarray Sum | medium | python、java、c++ |
238 | Product of Array Except Self | medium | python、java、c++ |
128 | Longest Consecutive Sequence | Hard | python、java、c++ |