Java 求解长度最小的子数组

Posted 南淮北安

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 求解长度最小的子数组相关的知识,希望对你有一定的参考价值。

一、题目

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

二、滑动窗口解析

所谓的滑动窗口:就是不断的调节子序列的起始位置和终止位置,从而得出我们想要的结果

这里还是以题目中的示例来举例,s=7, 数组是 2,3,1,2,4,3,来看一下查找的过程:


可以看出,滑动窗口也是双指针法的一种,只不过这种解法更像是一个窗口的移动,所以叫做滑动窗口更适合一些。

在本题中实现滑动窗口,主要确定如下三点:

  • 窗口内是什么?
  • 如何移动窗口的起始位置?
  • 如何移动窗口的结束位置?

窗口就是满足其和 ≥ s 的长度最小的连续子数组。

窗口的起始位置如何移动:如果当前窗口的值大于s了,窗口就要向前移动了(也就是该缩小了)。

窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,窗口的起始位置设置为数组的起始位置就可以了。

可以发现 滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将O(n^2)的暴力解法降为O(n)

三、代码

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int result = Integer.MAX_VALUE;
        //窗口的起始位置
        int i = 0;
        //记录滑动过程中的子数组和
        int sum = 0;
        int subLength = 0;
        //窗口的结束位置,遍历数组
        for (int j = 0; j < nums.length; j++) {
            sum += nums[j];
            //当窗口中子数组的和满足题意时,开始执行收缩操作
            while (sum >= target) {
                //当前子数组的长度
                subLength = j - i + 1;
                //取满足题意的最小长度
                result = Math.min(subLength, result);
                //窗口收缩
                sum -= nums[i++];
            }
        }
        return result == Integer.MAX_VALUE ? 0 : result;
    }
}

四、总结

滑动窗口左右指针的一种,滑动取子集,

注意窗口内是什么,窗口的起始位置,窗口的终止位置

整数最大值:Integer.MAX_VALUE
整数最小值:Integer.MIN_VALUE

以上是关于Java 求解长度最小的子数组的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 209. 长度最小的子数组c++/java详细题解

Java算法 每日一题 编号209:长度最小的子数组

Java算法 每日一题 编号209:长度最小的子数组

Java 求解最长重复子数组

leetcode 209. 长度最小的子数组 java

209数组-长度最小的子数组