leetcode209. 长度最小的子数组

leetcode链接

题目

leetcode209. 长度最小的子数组_第1张图片

思路

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

在暴力解法中,是一个for循环滑动窗口的起始位置,一个for循环为滑动窗口的终止位置,用两个for循环完成了一个不断搜索区间的过程。

滑动窗口则使用一个for循环来完成这个操作。

代码

代码1 双指针(滑动窗口)

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        left = 0
        right = 0
        num_sum = 0
        length = len(nums)+1
        while right<len(nums):
            num_sum += nums[right]
            while num_sum>=target:  # 注意while判断>=而不是<,不能用if
                length = min(length,right-left+1)
                num_sum -= nums[left]
                left += 1
            right += 1
        if length == len(nums)+1:
            return 0
        else:
            return length

代码2 暴力破解

class Solution:
    def minSubArrayLen(self, s: int, nums: List[int]) -> int:
        l = len(nums)
        min_len = float('inf')
        
        for i in range(l):
            cur_sum = 0
            for j in range(i, l):
                cur_sum += nums[j]
                if cur_sum >= s:
                    min_len = min(min_len, j - i + 1)
                    break
        
        return min_len if min_len != float('inf') else 0

你可能感兴趣的:(python)