暴力解法:
//暴力解法
public static int minSubArrayLen(int target, int[] nums) {
int result = Integer.MAX_VALUE; //表示最优解的长度
//第一层循环决定数组当中元素的起点
for (int i = 0; i < nums.length; i++) {
int sum = 0; //子数组的数值之和
//第二层循环决定数组元素的终点
for (int j = i; j < nums.length; j++) {
sum = sum + nums[j]; //计算起点到终点的数值总和
int len = j - i + 1; ///子数组的长度
if (sum >= target) {
result = Math.min(result, len);
}
}
}
if (result != Integer.MAX_VALUE) {
return result;
} else {
return 0;
}
}
暴力解法的思路就是遍历所有子数组,然后逐个比较长度
滑动窗口法:
public static int minSubArrayLen(int target, int[] nums) {
int slow = 0; //慢指针,表示子数组的起始位置,右移会导致总数值减少
int len = 0; //表示子数组的实际长度
int sum = 0; //表示子数组的数值和
int result = Integer.MAX_VALUE; //最优解的长度
for (int i = 0; i < nums.length; i++) { //i表示快指针,表示子数组的终止位置,右移会导致总数值增加
sum = sum + nums[i];
while (sum >= target) { //数值够了,那就慢指针右移
len = i - slow + 1;
result = Math.min(result,len);
sum = sum - nums[slow++];
}
}
if (result != Integer.MAX_VALUE) {
return result;
} else {
return 0;
}
}