暴力法
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int min = 0;
for(int i = 0; i < nums.length;i++){
int count = 0;
for(int j = i;j < nums.length; j++){
if(target <= (count += nums[j])){
if(min == 0){
min = j - i + 1;
} else if(min > j - i + 1){
min = j - i + 1;
}
}
}
}
return min;
}
}
虽然可以通过,但总觉得不够好,应该还有优化空间
- 空间复杂度:O(1)
- 时间复杂度:O(n^2)
暴力法优化版
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;
for(int j = i; j < nums.length; j++){
sum += nums[j];
if(sum >= target){
min = Math.min(min, j - i + 1);
break;
}
}
}
return min == Integer.MAX_VALUE? 0: min;
}
}
参考了题解,果然花费的时间更少了,暴力法也是要讲优化的
Java 的 API 还没好好利用,自己写的方法里就么有用到 Math.min
还有可以先将 min 赋值为 int 类型最大值这个方法也是自己未曾想到的
- 空间复杂度:O(1)
- 时间复杂度:O(n^2)
滑动窗口
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int min = Integer.MAX_VALUE;
int start = 0;
int sum = 0;
int winLength = 0;
for(int end = 0; end < nums.length; end++){
sum += nums[end];
while(sum >= target){
winLength = end - start + 1;
min = Math.min(min, winLength);
sum -= nums[start];
start++;
}
}
return min == Integer.MAX_VALUE? 0: min;
}
}
参考了题解
定义起始和结束两个指针,计算和直到 sum 大于等于 target
计算此时的序列长度并和 min 比较
随后修改起始指针和当前序列和的值
- 空间复杂度:O(1)
- 时间复杂度:O(n)