📅  最后修改于: 2023-12-03 15:07:00.146000             🧑  作者: Mango
假设有一个长度为N的数组nums和一个非负整数S,你需要找到一个最短的连续子数组,使得这个子数组的和大于等于S,返回这个最短的连续子数组的长度。
对于每一个元素,从该元素开始往后遍历,并记录遍历过的子数组之和来寻找最小连续子数组的长度。该方法的时间复杂度为O(N^2)。
def minSubArrayLen(s: int, nums: List[int]) -> int:
n=len(nums)
ans=float("inf")
for i in range(n):
sumnums=0
for j in range(i,n):
sumnums+=nums[j]
if sumnums>=s:
ans=min(ans,j-i+1)
break
return ans if ans!=float("inf") else 0
维护一个滑动窗口,通过双指针left和right来控制滑动窗口的大小。根据滑动窗口的大小来更新目标最小子数组长度。时间复杂度为O(N)。
def minSubArrayLen(s: int, nums: List[int]) -> int:
n=len(nums)
ans=float("inf")
sumnums=0
left=0
for right in range(n):
sumnums+=nums[right]
while sumnums>=s:
ans=min(ans,right-left+1)
sumnums-=nums[left]
left+=1
return ans if ans!=float("inf") else 0
滑动窗口方法时间复杂度更低,可以提高程序效率。应该尽可能的避免暴力循环的方式,优化方法代码,提升算法效率。