给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0
方法一:移动窗口
设置两个指针,刚开始都指向0,然后right向右移动直到sum>target,这时减去nums[left],同时left++;整个过程中记录right-left的最小值…
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int left = 0,right = 0;
int res = Integer.MAX_VALUE;
int sum = 0;
if(nums.length==0){//先排除空数组情况
return 0;
}
while(right<nums.length){
sum = sum+nums[right];//left不动,right右移寻找满足条件的最小right
right++;
while(sum>=target){
int temp = right-left;//left右移
res = Math.min(res,temp);//保存最小的res
sum-=nums[left];
left++;
}
}
res = (res==Integer.MAX_VALUE)?0:res;//判断整个过程中left是不是没移动
return res;
}
}
方法,自己第一次做的,用了三个for循环,超时了,答案上的暴力法要更巧妙一些,少了一个for循环
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int i = 0;
while(i<nums.length&&nums[i]<target){
i++;
}
if(i<nums.length){
return 1;
}
//求最小宽度i
for(i = 1;i<=nums.length;i++){
for(int j = 0;j<=nums.length-i;j++){
int sum = 0;
for(int k = j;k<j+i;k++){
sum = sum+nums[k];
}
if(sum>=target){
return i;
}
}
}
return 0;
}
}