数据结构与算法--滑动窗口python3

本文介绍了使用滑动窗口算法解决LeetCode上的几道经典问题,包括寻找长度最小的子数组、无重复字符的最长子串、至多包含两个不同字符的最长子串、至多包含K个不同字符的最长子串以及K个不同整数的子数组问题。通过集合和双指针技巧来动态维护窗口内的元素状态,从而找到满足条件的子数组或子串。
摘要由CSDN通过智能技术生成

滑动窗口

今天分享一些滑动窗口的题目以及对应的题解
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
解释: 因为无重复字符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值