给定一个含有 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右移寻找满足条件的最小rightright++;while(sum>=target){int temp = right-left;//left右移res = Math.min(res,temp);//保存最小的ressum-=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;}//求最小宽度ifor(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;}
}