题目要求
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
(leetcode209)
思路一
暴力解法,思路与冒泡排序相同,两层循环。
时间复杂度 O(n^2)
代码一
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int length = 0;//存放求和结果
int sum;
int i = 0;
int j;
while(i <= nums.length - 1) {
sum = 0;
j = i;
while(sum < target) {
sum += nums[j];
j ++;
if(j == nums.length && sum < target) {
return length;
}
}
if((j-i) < length || length == 0) {
length = j - i;
}
i ++;
}
return length;
}
}
思路二
滑动窗口。
大循环:
1.从左到右,先i自增,找到右边界,此时i不动,j自增找到左边界,此时为最小子串。
2.进入下次大循环。
时间复杂度 O(n)
代码二
class Solution {
public int minSubArrayLen(int target, int[] nums) {
//滑动窗口
int i = 0;
int j = 0;
int sum = 0;
int length = 0;
while(i < nums.length) {
while(sum < target) {//找到窗口右侧
if(i >= nums.length) {//右窗口到达末端,直接退出循环
return length;
}
sum += nums[i];
i ++;
}
while(sum >= target) {//找到当前最小子串
sum -= nums[j];
j ++;
}//此时子串前索引应为j-1
if((i-j+1) < length || length == 0) {
length = i - j + 1;
}
}
return length;
}
}