网站自己做服务器,营销网站建设免费,外冈网站建设,张家口领先的网站建设服务商给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl1, …, numsr-1, numsr] #xff0c;并返回其长度。如果不存在符合条件的子数组#xff0c;返回 0
方法一#xff1a;移动窗口 设置两个指针1, …, numsr-1, numsr] 并返回其长度。如果不存在符合条件的子数组返回 0
方法一移动窗口 设置两个指针刚开始都指向0然后right向右移动直到sumtarget,这时减去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.length0){//先排除空数组情况return 0;}while(rightnums.length){sum sumnums[right];//left不动right右移寻找满足条件的最小rightright;while(sumtarget){int temp right-left;//left右移res Math.min(res,temp);//保存最小的ressum-nums[left];left;}}res (resInteger.MAX_VALUE)?0:res;//判断整个过程中left是不是没移动return res;}
}方法自己第一次做的用了三个for循环超时了答案上的暴力法要更巧妙一些少了一个for循环
class Solution {public int minSubArrayLen(int target, int[] nums) {int i 0;while(inums.lengthnums[i]target){i;}if(inums.length){return 1;}//求最小宽度ifor(i 1;inums.length;i){for(int j 0;jnums.length-i;j){int sum 0;for(int k j;kji;k){sum sumnums[k];}if(sumtarget){return i;}}}return 0;}
}