209号题目
1.暴力解题法,不过因为一些极端情况会过不了leetcode,数据量少时代码还是ok的,就是时间复杂度不行,比如碰到这样的数组就不行了
图片:
思想就是按照1个数,2个数,一直到length个数循环,一遍一遍过数组,其实我第一次想的还是复杂了,也有更简单的暴力解法,但是代码已经写出来了,思想都差不多,只是用来记录菜鸡的第一次想法
//最笨的暴力解法
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int result = 0, circle = nums.length; //每次相加的长度
int i = 1;//从一个长度开始
boolean t = false;//false表示未找到,true表示找到
for(;i <= circle; i++){
for(int j = 0; j <= nums.length - i; j++){
int sum = 0;//和
int m = 1;//单次循环累加数
for(int k = j; m <= i; m++){ //依次将这i个数相加
sum+=nums[k++];
}
if(sum >= target)
t = true;
}
if(t) {//更新结果
if(result == 0) {result = i;}
else if(result > i){
result = i;
}
};
}
return result;
}
}
2.滑动窗口法,类似双指针,想当初第一次学到这个词还是在计网中,需要知道的是滑动窗口法的时间复杂度只有O(n)
//滑动窗口法(类似双指针)
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int result = Integer.MAX_VALUE;
int i = 0, j, sum = 0;//分别为起始位置与终止位置
for(j = 0; j < nums.length; j++){
sum += nums[j];
while(sum >= target){//注意为while,因为用if的话,只能用一次,没法滑动下去
result = result < (j - i + 1) ? result : (j - i + 1); // 更新结果
sum -= nums[i++]; //窗口每次向前滑动一,同时将此值减去
}
}
return result == Integer.MAX_VALUE ? 0 : result;
}
}