leetcode 209:长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。
示例: 
输入: s = 7, nums = [2,3,1,2,4,3]
输出: 2
解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组。
进阶:
如果你已经完成了O(n) 时间复杂度的解法, 请尝试 O(n log n) 时间复杂度的解法。

做这道题的时候,一直不知道怎么做,看到讨论区有人用双指针做了于是也尝试了一下,成功了。
记录一下。

class Solution:
    def minSubArrayLen(self, s: int, nums: List[int]) -> int:
        if not nums: return 0
        if sum(nums) < s: return 0
        l = 0
        r = 0
        val = 0   #记录两个指针中间数的和
        res = len(nums)
        while l < len(nums):
            if r < len(nums) and val < s: #如果和小于s,加上右指针指向的数,右指针右移
                val += nums[r]
                r += 1
            else: #否则减去左指针的数,左指针右移
                val -= nums[l]
                l += 1
            if val >= s: #更新最小长度
                res = min(res, r-l)
        return res

但是这个写下来之后运行时间不短,只超过了55%,于是又去评论区偷看了一下。
看到大佬一种O(n)的方法,偷一下。99.8%。
其实思路差不多。

class Solution:
    def minSubArrayLen(self, s, nums):
        total = left = 0
        result = len(nums) + 1
        for right, n in enumerate(nums):
            total += n
            while total >= s:
                result = min(result, right - left + 1) #更新最小长度
                total -= nums[left]
                left += 1
        return result if result <= len(nums) else 0

你可能感兴趣的:(leetcode 209:长度最小的子数组)