返回

LeetCode 209:长度最小的子数组

人工智能

哈喽,小伙伴们!今天,我们将踏上 LeetCode 209 题的征程,探索“长度最小的子数组”这个有趣的问题。准备好开启一段算法之旅了吗?

问题陈述

给定一个正整数数组 nums 和一个目标值 target,返回满足其和大于或等于 target 的最短子数组的长度。如果不存在这样的子数组,则返回 0。

举个栗子

  • 输入:nums = [2,3,1,2,4,3], target = 7
  • 输出:2
  • 解释:子数组 [4,3] 是满足和大于或等于 target 的最短子数组。

思路解析

解决这个问题,我们首先需要建立一个双指针模型。我们从数组的开头开始,让左指针指向第一个元素,让右指针指向第二个元素。然后,我们计算当前子数组的总和。如果总和小于目标值,我们将右指针向右移动一位,并将新元素包括在子数组中。否则,我们向左移动左指针一位,将第一个元素排除在子数组之外。我们重复这个过程,直到找到满足条件的最短子数组。

算法步骤

  1. 初始化左指针 left 为 0,右指针 right 为 1,当前子数组和 sum 为 0。
  2. 计算当前子数组的总和 sum = nums[left] + nums[left+1] + ... + nums[right-1]
  3. 如果 sum < target,右移右指针 right
  4. 否则(sum >= target),左移左指针 left
  5. 重复步骤 2-4,直到 right 指向数组最后一个元素。
  6. 记录下满足条件的最短子数组长度,并返回。

代码示例

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 题是一道经典的滑动窗口问题,它考验我们的算法设计和数据结构应用能力。希望今天的解题过程能对你有所启发,让我们在算法的海洋中继续扬帆远航!