python蓝桥杯学习-最小滑动窗口

一、滑动窗口介绍

滑动窗口的思想:所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果

滑动窗口也是双指针的一种应用,两个指针分别代表起始位置和终止位置滑动窗口也是用一层for循环做两层for循环的工作

滑动窗口可以分成两种,一种是最大滑动窗口,一种是最小滑动窗口,本文讨论的是最小滑动窗口

二、题目

题目

给定一个含有 n** 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 **连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。209. 长度最小的子数组 - 力扣(Leetcode)

解题思想

这道题可以用滑动窗口来做,要注意,滑动窗口的for循环变量一定是终止位置的指针。其移动是:终止位置的指针一直向后移动,计算终止位置前整个窗口的和,直到这个窗口的和大于目标值s,终止位置指针停止,移动起始指针,开始减小整个窗口的值,直到计算出不大于目标值s时,这个窗口就是最小的窗口了。

解题步骤

  1. 初始化起始指针,指向数组头部,即i=0。定义一个无穷大的数(用于后续窗口长度的比较中),res=float("inf")。定义初始的数组和sum=0

  1. 进入for循环,循环变量是终止指针j,j的最大长度是到达数组尾部,即循环条件为for j in range(len(nums))。移动终止指针,计算终止指针之前的所有数的和,sum+=nums[j]。直到这个和超过s,停止计算,开始缩小窗口,即进入while循环,while sum>=s

  1. 在while循环中缩小窗口,首先计算出数组此时的窗口长度,res=min(res,j-i+1),其中j-i+1指的是窗口此时的长度,接着开始缩小窗口,即减小窗口的值,sum-=nums[i],移动初始指针,i+=1

  1. 最后的返回值return0 if res == float("inf") else res,因为有可能是以下的情况:

  • 0(如果整个数组加起来都不能大于s的话)

  • 计算出的窗口长度。

解题代码

class Solution(object):
    def minSubArrayLen(self, target, nums):
        """
        :type target: int
        :type nums: List[int]
        :rtype: int
        """
        i = 0
        res = float("inf")
        sum = 0
        for j in range(len(nums)):
            sum += nums[j]
            while sum >= target:
                res = min(res,j-i+1)
                sum -= nums[i]
                i += 1
        return 0 if res == float("inf") else res

还有最大滑动窗口及代码的优化,但是我还没学完,暂时先写到这里啦~

你可能感兴趣的:(学习,python,算法,蓝桥杯)