难度:medium
1.暴力法
//1.暴力法
class Solution {
public int minSubArrayLen(int target, int[] nums) {
//记录最小长度
int min = Integer.MAX_VALUE;
for (int i = 0; i < nums.length; i++) {
int sum = 0;
int count = 0;
for (int j = i; j < nums.length; j++) {
sum += nums[j];
count++;
if (sum >= target) {
min = Math.min(min, count);
break;
}
}
}
//不存在符合条件的子数组,返回0
return min == Integer.MAX_VALUE? 0: min;
}
}
复杂度分析:
- 时间复杂度:O(n^2)
- 空间复杂度:O(1)
2.双指针
滑动窗口思想:
如果sum值小于target,右指针右移,直到sum大于等于target,sum减去左指针元素,并且左指针右移,直到sum小于target;
//2双指针
class Solution {
public int minSubArrayLen(int target, int[] nums) {
//记录最小长度
int min = Integer.MAX_VALUE;
int sum = 0;
for (int left = 0, right = 0; right < nums.length;) {
sum += nums[right++];
//注意是while不是if
while (sum >= target) {
min = Math.min(min, right - left);
sum -= nums[left++];
}
}
//不存在符合条件的子数组,返回0
return min == Integer.MAX_VALUE? 0: min;
}
}
复杂度分析:
- 时间复杂度:O(n)?????
卡哥: 不要以为for里放一个while就以为是O(n^2)啊, 主要是看每一个元素被操作的次数,每个元素在滑动窗后进来操作一次,出去操作一次,每个元素都是被被操作两次,所以时间复杂度是 2 × n 也就是O(n)。
- 空间复杂度:O(1)
3.前缀和+二分法