双指针法解LeetCode 209:最小长度满足和的子数组

需积分: 0 1 下载量 163 浏览量 更新于2024-06-30 收藏 1.62MB PDF 举报
在力扣500题刷题笔记6中,讨论的是LeetCode第209题“长度最小的子数组”(Minimum Length of Subarray Sum)。此题要求在给定一个包含n个正整数的数组nums和一个正整数target的情况下,找到数组中和至少等于target的最小子数组长度。如果不存在符合条件的子数组,则返回0。 解题思路主要采用双指针方法,涉及到两个关键指针i和j。初始时,i和j都指向数组的起始位置,sum(滑动窗口和)为0。整个过程可以分为以下几个步骤: 1. 初始化:设置i=0,j=0,sum=0,两指针同时指向数组的第一个元素。其中,i用于扩展窗口,即向右移动,而j用于收缩窗口,即向左移动。 2. 枚举过程:遍历整个数组nums,随着i的递增,每次更新滑动窗口的和sum,即sum += nums[i]。这个过程确保窗口内的和始终增加。 3. 检查和的边界:当sum大于等于target时,说明找到一个可能的窗口。然而,如果此时移除窗口左侧的元素(即减去nums[j]),sum仍大于等于target,说明左侧元素不再必要,可以收缩窗口,即j自增1,并调整sum的值为sum - nums[j]。 4. 重复步骤3,直到窗口无法进一步收缩或sum小于target。在每次收缩过程中,都要判断当前窗口是否是最小满足条件的,如果找到更小的长度,记录下来。 5. 遍历结束后,如果没有找到任何满足条件的子数组,返回0,否则返回找到的最小子数组长度。 举例说明: - 示例1:target=7, nums=[2,3,1,2,4,3],最小子数组是[4,3],长度为2。 - 示例2:target=4, nums=[1,4,4],最小子数组是[4],长度为1。 - 示例3:target=11, nums=[1,1,1,1,1,1,1,1],由于没有连续子数组和大于等于11,返回0。 这个算法的关键在于动态调整滑动窗口大小,找到满足条件的子数组,同时保持时间复杂度在O(n),非常适合处理这类区间和问题。