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