给定一个含有 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