leetcode209 长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
示例 1:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
示例 2:
输入:target = 4, nums = [1,4,4]
输出:1
示例 3:
输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0
一、滑动窗口
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int left=0; //左边界
int right=0;//右边界
int sum=0;
int res=nums.length+1;//初始化是为了防止结果不存在
while(right<nums.length){
sum+=nums[right++];//让右边界进行移动
while(sum>=target){
res=Math.min(res,right-left);//求长度最小的子数组
sum-=nums[left++];//左边界进行移动
}
}
return res==nums.length+1?0:res;
}
}
二、滑动窗口模板
分享一个滑动窗口模板,是在leetcode上看到别人写的,他是写的python版,改成了Java版本,感觉挺好的,有利于理解滑动窗口思想。可以利用这个思想来尝试一下leetcode1001 最大连续1的个数
public int findSubArray(int[] nums,int target){
//数组/字符串长度
int len=nums.length;
//双指针,表示当前遍历的区间[left, right],闭区间
int left=0, right = 0;
//用于统计子数组/子区间是否有效,根据题目可能会改成求和/计数
int sum = 0;
//保存最大的满足题目要求的 子数组/子串 长度
int res = 0;
//当右边的指针没有搜索到数组/字符串的结尾
while (right<len){
//增加当前右边指针的数字/字符的求和/计数
sum += nums[right]
//此时需要一直移动左指针,直至找到一个符合题意的区间
while 区间[left, right]不符合题意{
//移动左指针前需要从counter中减少left位置字符的求和/计数
sum -= nums[left];
//真正的移动左指针,注意不能跟上面一行代码写反
left++;
}
//到while 结束时,我们找到了一个符合题意要求的子数组/子串
res = Math.max(res, right - left + 1) //需要更新结果
right ++; //移动右指针,去探索新的区间
}
return res
}