给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
一,使用暴力查找的方法
暴力查找的方法比较简单,这里先不展示了,直接步入正题
二,使用滑动窗口
代码思路:
设置两个指针,一左一右。先使用右指针从左到右遍历数组,将右指针所遍历到的数组元素相加,直到大于或等于目标元素,以此来确定子数组的结束位置;然后使用左指针从左向右移动,逐渐缩小子数组的长度,确定子数组的最小长度
此时子数组的长度应该等于right-left+1
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int sum = 0;
int result = Integer.MAX_VALUE;
int left = 0;
for(int right = 0;right<nums.length;right++){
sum+=nums[right];
while(sum>=target){
result = Math.min(result, right - left + 1);
sum-=nums[left];
left++;
}
}
return result == Integer.MAX_VALUE ? 0 : result;
}
}
定义最终的返回值,使它的初始值为int类型的最大值(Integer.MAX_VALUE),如果最终result的值没有被改变依然是Integer.MAX_VALUE,则证明数组中不存在目标子数组,直接返回0,如果存在目标子数组,则返回result即是目标子数组的长度