题目描述
给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
题目来源
解题思考
版本一:首先是考虑双层遍历,如果当前子数组长度小于记录的长度,则进行更新。由于时间复杂度是o(n的平方),所以超出了时间限制。
版本二:参考了一些大牛的解法,主要是利用双指针以及滑动窗口的方法进行实现。降低了时间复杂度。总体思想还是利用有限的空间实现更快速的运算。
代码实现
版本一:
def minSubArrayLen(target, nums):
"""
:type target: int
:type nums: List[int]
:rtype: int
"""
if len(nums)==0:
return 0
sum1=0
for i in range(len(nums)):
sum1+=nums[i]
if sum1< target:
return 0
len1 = len(nums)
for i in range(len(nums)):
sum=nums[i]
if sum>target or sum==target:
return 1
for j in range(i+1,len(nums)):
sum+=nums[j]
if sum > target or sum == target:
if j-i+1 < len1:
len1=j-i+1
break
return len1
版本二:
class Solution(object):
def minSubArrayLen(self, target, nums):
"""
:type target: int
:type nums: List[int]
:rtype: int
"""
minlen=2**32
i=0
r=0
tag=False
sum=0
while r<len(nums):
sum+=nums[r]
while sum>=target:
tag=True
minlen=min(minlen,r-i+1)
sum-=nums[i]
i+=1
r+=1
return minlen if tag else 0
性能评估
心之所向,素履以往。
心得:无法改变我们的环境,那就平和我们的心境,面对回避不掉的问题,迎面而上,全力以赴。问心无愧就好。