leetcode 209 长度最小的子数组
程序员文章站
2022-07-14 18:16:16
...
209. 长度最小的子数组
难度 中等
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的连续子数组,返回 0。
使用两个指针, 使用滑动窗口的思想, 当窗口内的数据之和小于target时, 右侧增加数据, 当窗口之内数据之和大于等于target时, 左侧减少数据, 直到右侧不能移动
第一个版本:
class Solution:
def minSubArrayLen(self, s: int, nums: List[int]) -> int:
ans = 0
if sum(nums) < s:
return ans
ans = len(nums)
left = 0
right = 0
betweensum = 0
while right < len(nums):
betweensum = sum(nums[left:right + 1]) # 最耗时的操作, 应修改
if betweensum >= s:
num = right - left + 1
if num < ans:
ans = num
left += 1
else:
right += 1
return ans
第一个版本的结果是这样的
战胜了5%
上面已经提到, 最耗时的就是求和的操作, 其实每次的求和结果, 可以直接求下一次的求和结果, 不要这样不停地求和, 修改代码后如下:
class Solution:
def minSubArrayLen(self, s: int, nums: List[int]) -> int:
ans = 0
if sum(nums) < s:
return ans
ans = len(nums)
left = 0
right = 0
betweensum = 0
betweensum = sum(nums[left:right + 1])
while True:
if betweensum >= s:
num = right - left + 1
if num < ans:
ans = num
betweensum -= nums[left]
left += 1
else:
right += 1
if right == len(nums):
break
betweensum += nums[right]
return ans
我们把最初的求和操作放在循环外面, 这次求和结果可以求得下一次的结果
推荐阅读
-
【LeeCode 中等 数组 python3】209. 长度最小的子数组
-
[leetcode](4.21)4. 有效子数组的数目
-
【LeetCode-153】153.寻找旋转排序数组中的最小值
-
程序员代码面试指南 python实现(第一章 栈和队列 :最大值减去最小值小于或等于num的子数组数量)
-
leetcode 第907题 子数组的最小值之和 python解法
-
LeetCode-907.子数组的最小值之和
-
Java实现给定一个无序的整数数组,找到其中最长上升子序列的长度。
-
LeetCode 907 - 子数组的最小值之和
-
leetcode 209 长度最小的子数组
-
LeetCode:长度最小的子数组【209】