滑动窗口
今天分享一些滑动窗口的题目以及对应的题解
1.长度最小的子数组 Leetcode#209
题目:给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
输入:target = 4, nums = [1,4,4]
输出:1
输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0
提示:
1 <= target <= 109
1 <= nums.length <= 105
1 <= nums[i] <= 105
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
n = len(nums)
sums = left = 0
minsize = float("inf")
for right in range(n):
sums += nums[right]
while sums >= target:
minsize = min(minsize,right-left+1)
sums -= nums[left]
left += 1
return minsize if minsize != float("inf") else 0
这算是一道经典的滑动窗口题了,通过sums来记录和,然后判断这个和是否大于等于target,如果条件成立的话就更新minsize,并且减去nums中左指针对应的值,且左指针向右一格,循环结果就可以输出结果了。题目所给的值都是大于0的,所以和一直是增加的,如果有负数这么做就不行了。
2. 无重复字符的最长子串 Leetcode#3
题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符