一、题目:
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和≥target 的长度最小的连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回0 。
二、暴力解法:
用两个for循环,一个控制起始位置,一个控制终止位置,在区间内搜索,最后枚举出区间来比长短。
三、滑动窗口(类似双指针)
定义个起始位置和终止位置,先移动终止位置,当起始位置和终止位置之间数据的和大于target,那么记录数据并让起始位置向前移动一个位置。
四、解题思路:
设置一个初始指针,设置一个sum来记录初始位置和结束位置之间的数的和,设置一个结果来与下文中的chang比较,并作为返回值返回,这个长要设置为最大值,即数组长度+1。
当初始位置和结束位置之间的数的和大于等于要找的数时,设置一个长来记录初始位置到结束位置之间的长度,判断结束之后让初始指针向前移动,向前移动之后sum应该减去初始指针移动前所处位置的值。
最后用条件运算符来判断,如果如果不存在符合条件的子数组,返回0,如果存在符合条件的子数组返回res。
五、完整代码:
import java.util.Arrays;
public class Solution {
public static int minSubArrayLen(int target, int[] nums) {
//设置一个初始指针
int begin = 0;
//设置一个sum来记录初始位置和结束位置之间的数的和
int sum = 0;
//设置一个结果来与下文中的chang比较,并作为返回值返回,这个长要设置为最大值,即数组长度+1
int res = nums.length + 1;
for (int end = 0;end < nums.length;end++){
sum += nums[end];
//当初始位置和结束位置之间的数的和大于等于要找的数时
while(sum >= target){
//设置一个长来记录初始位置到结束位置之间的长度
int chang = end - begin + 1;
if (chang < res){
res = chang;
}
//判断结束之后让初始指针向前移动
//向前移动之后sum应该减去初始指针移动前所处位置的值
sum = sum - nums[begin];
begin++;
}
}
//最后用条件运算符来判断,如果如果不存在符合条件的子数组,返回0,如果存在符合条件的子数组返回res
return (res != (nums.length + 1)) ? res : 0;
}
public static void main(String[] args) {
int target = 7;
System.out.println("target = " + target);
int[] nums = {2, 3, 1, 2, 4, 3};
System.out.println("nums = " + Arrays.toString(nums));
System.out.println(minSubArrayLen(target, nums));
}
}