给定一个含有 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 <= 109 1 <= nums.length <= 105 1 <= nums[i] <= 105
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-size-subarray-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
参考Carl的滑动窗口
时间复杂度O(n):每个元素在滑动窗口进来时操作一次,出去时操作一次,即每个元素都是被操作两次。
空间复杂度O(1)
代码
class Solution {
public int minSubArrayLen(int target, int[] nums) {
//使用滑动窗口
int result = nums.length+1;//存储结果,初始化为一个不可能为结果的较大值
int i=0;//窗口起始位置
int sum = 0;//临时变量,用于存储临时滑动窗口的和
int subLen = 0;//滑动窗口的大小
//遍历查找,j为滑动窗口的结束位置
for(int j=0; j<nums.length; j++){
sum += nums[j];
//满足了条件以后判断两个下标的差+1,即为元素个数
while(sum >= target){
subLen = j-i+1;//确定滑动窗口大小
//让结果取较小的滑动窗口大小
result = (result < subLen? result :subLen);
//改变滑动窗口起始位置,准备进入下一轮循环
sum -= nums[i++];
}
}
//result的值如果没有被改变过,即为没有符合条件的解,返回0
return result == nums.length+1 ? 0 : result;
}
}