📅  最后修改于: 2023-12-03 14:54:35.589000             🧑  作者: Mango
给定一个包含n个正整数的数组和一个正整数s,在数组中找到一段连续子数组,使得该子数组的数字和大于或等于s,并返回该子数组的最小长度。如果不存在这样的子数组,则返回0。
使用滑动窗口算法。通过移动左右指针来计算子数组的和,如果大于等于s,更新最小长度并将左指针向右移动;否则将右指针向右移动。直到右指针超出数组范围为止。
def minSubArrayLen(s, nums):
left, right, sum = 0, 0, 0
ans = float('inf')
while right < len(nums):
sum += nums[right]
while sum >= s:
ans = min(ans, right-left+1)
sum -= nums[left]
left += 1
right += 1
return ans if ans != float('inf') else 0
时间复杂度:O(n)。left和right每个元素只会被遍历一次,因此时间复杂度为O(n)。
空间复杂度:O(1)。仅需要常数级别的额外空间。
滑动窗口算法是一种非常有效的解决子数组问题的方法,时间复杂度为O(n),空间复杂度为O(1)。在面试和工作中可能会经常遇到类似的问题,掌握该算法能够提高解决这类问题的效率。