209 长度最小的子数组 复杂度理解

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)。

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值