给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
思路一:
用左右两个指针滑动,先固定左指针移动右指针,每次移动右指针sum加上右指针所在的值,当sum >= target 记下此时数组长度为 右指针索引 - 左指针索引 + 1 , 此时再向后移动右指针数组长度必然大于当前长度,故移动左指针进行下一组判断。
- 初始result值设置为 len(nums)+1,因为符合条件的子数组长度一定小于等于原数组长度,初始设置超出范围的值以便后面比较取最小值
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
l = r = 0
n = len(nums)
result = n + 1
sum = 0
while r < n :
sum += nums[r]
while sum >= target:
result = min(result, r - l + 1)
sum -= nums[l]
l += 1
r += 1
return result if result != n+1 else 0
思路二:
暴力美学
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
lens = len(nums)
sublen = 0
result = lens + 1
for i in range(lens):
sum = 0
for j in range(i,lens):
sum = sum + nums[j]
if sum >= target:
sublen = j - i + 1
result = min(result,sublen)
break
return 0 if result == lens + 1 else result