返回

英雄所见略同!LeetCode 轻松拿下——长度最小的子数组(滑动窗口)

前端

题目

给定一个整数数组 nums 和一个目标值 target,请你寻找数组中长度最小的子数组,使得该子数组的和大于等于 target。

解题思路

本题的解题思路是利用滑动窗口算法。滑动窗口算法是一种广泛用于数组问题的算法,它通过一个窗口在数组中移动,并不断更新窗口中的数据,从而高效地解决问题。

1. 初始化滑动窗口

首先,我们将滑动窗口初始化为包含数组中第一个元素的子数组。窗口的左边界和右边界都指向数组的第一个元素。

2. 核心循环体

接下来,我们将进入滑动窗口的核心循环体。在这个循环中,我们将不断移动窗口,直到窗口中的元素之和大于等于 target。

在循环的每一步,我们将执行以下操作:

  • 计算窗口中元素之和。
  • 如果窗口中元素之和大于等于 target,则更新窗口长度最小的子数组的长度并移动窗口的右边界。
  • 否则,移动窗口的左边界。

3. 判断返回

当循环结束时,我们已经找到了满足条件的窗口。此时,我们将返回窗口的长度。

完整代码

def min_sub_array_len(target, nums):
    """
    :type target: int
    :type nums: List[int]
    :rtype: int
    """
    # 初始化滑动窗口
    left = 0
    right = 0
    window_sum = 0

    # 初始化窗口长度最小的子数组的长度
    min_length = float('inf')

    # 核心循环体
    while right < len(nums):
        # 计算窗口中元素之和
        window_sum += nums[right]

        # 如果窗口中元素之和大于等于 target
        while window_sum >= target:
            # 更新窗口长度最小的子数组的长度
            min_length = min(min_length, right - left + 1)

            # 移动窗口的左边界
            window_sum -= nums[left]
            left += 1

        # 移动窗口的右边界
        right += 1

    # 判断返回
    if min_length == float('inf'):
        return 0
    else:
        return min_length

题目反思

这道题目是对滑动窗口算法的典型应用。通过巧妙地利用滑动窗口,我们可以高效地求出长度最小的子数组。

这道题目也告诉我们,在解决数组问题时,滑动窗口算法是一种非常有效的工具。掌握滑动窗口算法,可以帮助我们轻松解决许多难题。