数组之长度最小的子数组

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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值