题目描述
给定一个含有 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-size-subarray-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我的想法
我的想法是一个滑动窗口的一个思想,用两个指针,一个表示开始一个表示结束,首先两个指针初始都为0,sum也是0,然后结束指针移动,使得sum>=target,然后结束指针不动,开始指针动,使得sum<target,在继续前面的操作。
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int min = nums.length;
int i = 0;
int j = 0;
int sum = 0;
while (j < nums.length) {
if (sum >= target && sum - nums[i] >= target) {
sum -= nums[i];
i ++;
}else if (sum >= target && sum - nums[i] < target) {
int num = j - i + 1;
// sum += nums[j];
if (min > num) {
min = num;
}
j ++;
if (j < nums.length) sum += nums[j];
}else {
sum += nums[j];
if (sum < target) {
j ++;
}
}
}
if (sum < target && min == nums.length) min = 0;
return min;
}
}
答案代码
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int n = nums.length;
if (n == 0) {
return 0;
}
int ans = Integer.MAX_VALUE;
int start = 0, end = 0;
int sum = 0;
while (end < n) {
sum += nums[end];
while (sum >= target) {
ans = Math.min(ans, end - start + 1);
sum -= nums[start];
start++;
}
end++;
}
return ans == Integer.MAX_VALUE ? 0 : ans;
}
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/minimum-size-subarray-sum/solution/chang-du-zui-xiao-de-zi-shu-zu-by-leetcode-solutio/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
同样的思想,但是答案代码量又少,运行时间也少,这就是需要学习的地方。