返回
LeetCode 209:长度最小的子数组
人工智能
2023-10-25 23:31:05
哈喽,小伙伴们!今天,我们将踏上 LeetCode 209 题的征程,探索“长度最小的子数组”这个有趣的问题。准备好开启一段算法之旅了吗?
问题陈述
给定一个正整数数组 nums 和一个目标值 target,返回满足其和大于或等于 target 的最短子数组的长度。如果不存在这样的子数组,则返回 0。
举个栗子
- 输入:nums = [2,3,1,2,4,3], target = 7
- 输出:2
- 解释:子数组 [4,3] 是满足和大于或等于 target 的最短子数组。
思路解析
解决这个问题,我们首先需要建立一个双指针模型。我们从数组的开头开始,让左指针指向第一个元素,让右指针指向第二个元素。然后,我们计算当前子数组的总和。如果总和小于目标值,我们将右指针向右移动一位,并将新元素包括在子数组中。否则,我们向左移动左指针一位,将第一个元素排除在子数组之外。我们重复这个过程,直到找到满足条件的最短子数组。
算法步骤
- 初始化左指针
left
为 0,右指针right
为 1,当前子数组和sum
为 0。 - 计算当前子数组的总和
sum = nums[left] + nums[left+1] + ... + nums[right-1]
。 - 如果
sum < target
,右移右指针right
。 - 否则(
sum >= target
),左移左指针left
。 - 重复步骤 2-4,直到
right
指向数组最后一个元素。 - 记录下满足条件的最短子数组长度,并返回。
代码示例
def minSubArrayLen(nums, target):
left = 0
right = 1
min_len = float('inf')
sum = nums[left]
while right <= len(nums):
if sum < target:
if right < len(nums):
sum += nums[right]
right += 1
else:
break
else:
min_len = min(min_len, right - left)
sum -= nums[left]
left += 1
return min_len if min_len != float('inf') else 0
总结
通过巧妙运用双指针技巧,我们成功地找到了满足条件的最短子数组。这个算法的时间复杂度为 O(n),其中 n 是数组的长度。LeetCode 209 题是一道经典的滑动窗口问题,它考验我们的算法设计和数据结构应用能力。希望今天的解题过程能对你有所启发,让我们在算法的海洋中继续扬帆远航!