【数组】长度最小数组
https://leetcode.cn/problems/minimum-size-subarray-sum/
方法:滑动窗口
暴力(RE)
runtime error
时间复杂度过高
传统的暴力,即两层for,第一层遍历数组每个元素,第二个从该下标开始计算sum,sum >= target 即是一个result,然后进行比较,找到最小的那个result
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int min = Integer.MAX_VALUE;
boolean flag = false;
for(int i = 0; i < nums.length; i++) {
int result = 0;
for(int j = i; j < nums.length; j++) {
result+=nums[j];
if(result >= target) {
flag = true;
min = Math.min(min, j - i+1);
break;
}
}
}
if (flag) {
return min;
}
return 0;
}
}
但是这个方法时间复杂度太高:
滑动窗口
使用两个指针 i 和 j,其中:
i:起始位置
j:结束位置
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int i = 0; // 起始
int result = Integer.MAX_VALUE;
int sum = 0;
for(int j = 0; j < nums.length; j++) {
sum += nums[j];
while(sum >= target) {
result = Math.min(result, j - i + 1);
sum -= nums[i++];
}
}
return result == Integer.MAX_VALUE ? 0 : result;
}
}