class Solution {
public int minSubArrayLen(int target, int[] nums) {
/*我的思路有点奇怪,我没实现。。
比如在数组里先存两个两个之和,然后一个数字用来记录本次是2个之和
再用这些结果去比较
如果有合适的就返回
没有合适的就继续在两个和的基础上加上一个
再用这些结果去比较
直到变成长度之和,每一项都相加
没考虑过这个的复杂度,但貌似这种也是遍历。。没什么改善
最好的还是滑动窗口*/
int res = 100001;
int sum = 0;
int i = 0,j = 0;
for(;j < nums.length;j++){
sum+=nums[j];
while(sum>=target){
int now = j - i +1;
res = res < now?res:now;
sum-=nums[i];
i++;
}
}
return res == 100001 ? 0 : res;
}
}
滑动窗口比较灵活,像遍历但是又省去了从最小开始判断的情况,让这个sum的值一直在target周围判断,比如此时sum比target小,就往后一个,大了就减去前面的值,这样来回的操作,每一个都没丢掉,又丢掉了多余的情况,并且每一次都是判断了前面情况中最优解的值,所以更不会存在遗漏的情况。
它的时间复杂度是O(n),我是这样理解的,就举一个比较极端的情况,j++,i++,每次增加一个数字都比target大,每次减去一个都比target小,这样进去一次,出来一次,总共就是2*n,也就是O(n)。