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 求解长度最小的子数组的主要内容,如果未能解决你的问题,请参考以下文章