leetcode|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

【leetcode|leetcode 209(长度最小的子数组)】但是这个写下来之后运行时间不短,只超过了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

    推荐阅读