Leetcode--209. 长度最小的子数组
发布日期:2021-04-30 21:06:36 浏览次数:67 分类:精选文章

本文共 1429 字,大约阅读时间需要 4 分钟。

为了解决这个问题,我们需要找到数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。

方法思路

我们可以使用双指针法来解决这个问题。双指针法的基本思想是使用两个指针来滑动窗口,记录当前窗口的和。当窗口的和大于等于 s 时,尝试减少窗口的长度;当窗口的和小于 s 时,扩大窗口的长度。

具体步骤如下:

  • 初始化两个指针 i 和 j,都从数组的起点开始。
  • 使用 sum 来记录当前窗口的和。
  • 当 sum 小于 s 且 j 没有达到数组的末尾时,继续扩大窗口。
  • 当 sum 大于等于 s 时,记录当前窗口的长度,并尝试减少窗口的长度。
  • 继续调整窗口的位置,直到找到最小的窗口长度。
  • 解决代码

    public class Solution209 {
    public static int minSubArrayLen(int s, int[] nums) {
    int i = 0, j = 0, sum = 0;
    int t = Integer.MAX_VALUE;
    // 扩大窗口,直到和 >= s 或者 j 到达末尾
    while (j < nums.length && sum < s) {
    sum += nums[j];
    j++;
    }
    // 如果和已经满足条件,开始尝试缩小窗口
    if (sum >= s) {
    t = j - i;
    // 尽量缩小窗口
    while (i < j && sum >= s) {
    sum -= nums[i];
    i++;
    // 更新最小长度
    if (j - i < t) {
    t = j - i;
    }
    }
    }
    // 如果没有找到符合条件的子数组,返回0
    return t != Integer.MAX_VALUE ? t : 0;
    }
    public static void main(String[] args) {
    int[] nums = {2, 3, 1, 2, 4, 3};
    int s = 7;
    System.out.println(minSubArrayLen(s, nums));
    }
    }

    代码解释

  • 初始化变量:i 和 j 指针都初始化为 0,sum 用于记录当前窗口的和,t 用于记录最小窗口的长度。
  • 扩大窗口:当 sum 小于 s 且 j 没有到达数组的末尾时,继续扩大窗口,直到满足条件。
  • 缩小窗口:当 sum 大于等于 s 时,开始尝试缩小窗口,记录当前窗口的长度,并更新最小长度 t。
  • 返回结果:如果没有找到符合条件的子数组,返回 0;否则返回最小窗口长度 t。
  • 这种方法确保了在 O(n) 时间复杂度内解决问题,适用于处理较大的数组。

    上一篇:【Python8】requests库,百度人脸API,IPCamera
    下一篇:linux定时备份mysql数据库并发送邮件通知

    发表评论

    最新留言

    表示我来过!
    [***.240.166.169]2026年06月20日 19时03分12秒