给定一个含有 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
提示:
1 <= target <= 1091 <= nums.length <= 1051 <= nums[i] <= 105
进阶:
- 如果你已经实现 **
O(n)时间复杂度的解法, 请尝试设计一个O(n log(n))时间复杂度的解法。
解题思路:这道题如果使用暴力解法就会出现超时的情况,暴力解法的时间复杂度是O(n);前缀+滑动窗口 假设数组为[a,b,c,d,e,f] 定义right=0,先a+b+c+d>=target的比较..=sum,right依次递增, 直到sum>=target;关键的步骤来了 比如是加到a+b+c时>=target,下一步就是判断sum-a >=target,也就是left=0 left++
如果sum-a >=target,那么继续sum-a-b >=target的判断,left继续++
如果sum-a < target,那么继续right++,也就是b+c+d>=target的比较
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int minLength = Integer.MAX_VALUE ;
int sum = 0 ;
int left = 0 ;
for (int right = 0; right < nums.length; right++) {
sum += nums[right];
while (sum >= target){
minLength = Math.min(minLength,right - left +1);
sum -= nums[left++];
}
}
return minLength==Integer.MAX_VALUE ?0:minLength;
}
}