leetcode-209-长度最小的子数组

题目描述:

 

 

方法一:双指针 O(N)

class Solution:
    def minSubArrayLen(self, s: int, nums: List[int]) -> int:
        left = 0
        res = float('inf')
        sum = 0
        for i in range(len(nums)):
            sum += nums[i]
            while sum >= s:
                res = min(res,i-left+1)
                sum -= nums[left]
                left += 1
        return res if res != float("inf") else 0
                    
                    
                

方法二: 前缀和+二分 O(NlogN)

class Solution:
    def minSubArrayLen(self, s: int, nums: List[int]) -> int:
        if not nums:
            return 0
        
        n = len(nums)
        ans = n + 1
        sums = [0]
        for i in range(n):
            sums.append(sums[-1] + nums[i])
        
        for i in range(1, n + 1):
            target = s + sums[i - 1]
            bound = bisect.bisect_left(sums, target)
            if bound != len(sums):
                ans = min(ans, bound - (i - 1))
        
        return 0 if ans == n + 1 else ans

 

posted @ 2019-10-03 11:17  oldby  阅读(122)  评论(0编辑  收藏  举报