赞
踩
给定一个含有 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
进阶:
O(n)
时间复杂度的解法, 请尝试设计一个 O(n log(n))
时间复杂度的解法。滑动窗口
- class Solution {
- public int minSubArrayLen(int target, int[] nums) {
- int len = nums.length,min = Integer.MAX_VALUE;
- int sum = 0,i = 0,j = 0;
- while(i < len && j < len){//当元素边界合法时
- sum += nums[j];//记录总和
- if(sum >= target){//当找到大于target的数组时
- min = Math.min(min,j-i+1);//记录长度
- sum -= nums[i];//减去头值,从下一个i开始
- sum -= nums[j];//减去尾值,因为下个循环还要加一遍,不减去就会多
- i++;//更新头
- }
- else j++;//更新尾
- }
- return min==Integer.MAX_VALUE?0:min;//返回最小
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。