python力扣刷题记录_209长度最小的子数组

#思路:

#1. 初始化窗口和s和左端点left。

#2. 枚举右端点right,更新窗口和s。

#3. 如果窗口和s大于等于target,更新答案ans。

#4. 返回答案ans。

#滑动窗口
#注意:数组元素都是正数
from math import inf

class Solution:
    def minSubArrayLen(self,target:int,nums:list[int]) ->int:
        n = len(nums)
        ans = inf#初始化答案为正无穷
        s = 0#初始化窗口和
        left = 0
        for right,x in enumerate(nums):#枚举右端点,x = nums[right]
            s += x#窗口和加上当前元素
            while s - nums[left] >= target:
                s -= nums[left]#窗口和减去左端点元素
                left += 1#左端点右移
            if s >= target:
                ans = min(ans,right-left+1)#更新答案
        return ans if ans <= n else 0#返回答案
#示例
print(Solution().minSubArrayLen(7,[2,3,1,2,4,3]))

#写法二:

class Solution:
    def minSubArrayLen(self,target:int,nums:list[int]) ->int:
        n = len(nums)
        ans = inf#初始化答案为正无穷
        s = 0#初始化窗口和
        left = 0
        for right,x in enumerate(nums):#枚举右端点,x = nums[right]
            s += x#窗口和加上当前元素
        #     while s - nums[left] >= target:
        #         s -= nums[left]#窗口和减去左端点元素
        #         left += 1#左端点右移
        #     if s >= target:
        #         ans = min(ans,right-left+1)#更新答案
        # return ans if ans <= n else 0#返回答案
            while s >= target:
                ans = min(ans,right-left+1)
                s -= nums[left]
                left += 1
        return ans if ans <= n else 0
#示例
print(Solution().minSubArrayLen(7,[2,3,1,2,4,3]))

#时间复杂度:O(n),空间复杂度:O(1)

#双指针的应用场景:单调性

你可能感兴趣的:(leetcode,算法,数据结构)