9.《滑动窗口篇》---①长度最小的子数组(中等)

滑动窗口推导过程

我们不能说一上来就知道这个题目用滑动窗口,然后就使用滑动窗口的方法来做这个题目。

首先我们想到的应该是暴力解法。

接着再优化为滑动窗口

由于数字都是 ≥ 0 的数。因此累加的数越多。和越大。

因此right往后遍历的时候。当发现sum > target 就可以不用再往右移动了。

此时left往右移动一位。

按照暴力枚举。right 还需要从新回到left的位置。再次计算累加和是否≥target。

而我们发现 (使用暴力解法的时候两个指针可以不会退。就可以用滑动窗口了)

此时只需要让sum-2 然后再次判断。就可以了。而right不用移动。

这就引入了滑动窗口。

利用单调性,+同向双指针。

滑动窗口的使用:

  1. left = 0,right =0;

2.进窗口

3.判断

4.出窗口

方法一:暴力解法

java 复制代码
class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int n = nums.length;
        int minLen = Integer.MAX_VALUE;// 用于存储最短子数组的长度

        for(int i = 0; i < n; i++){
            int sum = 0;// 每次外层循环重新初始化sum
            for(int j =i; j<n; j++){
                sum += nums[j];// 计算子数组的和
                if(sum >= target){// 如果子数组的和大于或等于目标值
                    minLen = Math.min(j-i+1,minLen);// 更新最短长度
                    break;// 提前结束当前内层循环,因为长度已经达到条件
                }
            }
        }
        return minLen == Integer.MAX_VALUE ? 0 : minLen;
        // 如果没有符合条件的子数组,返回0
    }
}   

复杂度分析

  • 时间复杂度: O(n2)O(n^2)O(n2)(嵌套双重循环导致的平方复杂度)
  • 空间复杂度: O(1)O(1)O(1)(只使用了常量级别的额外空间)

解法二:滑动窗口(利用单调性+ "同向双指针")

1.left = 0,right = 0

2.进窗口。我们让right++,并且 sum += numsright;

3.判断条件。使用while循环判断

4.出窗口:sum -= numsleft++;

注意:

判断条件的时候一定要使用while循环。而不是if。

因为left++一次之后。也可能继续满足条件。

如果使用 if 很可能会漏掉正确答案。

java 复制代码
class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int n = nums.length;
        int minLen = Integer.MAX_VALUE;// 用于存储最短子数组的长度
        int sum = 0;

        for(int left = 0,right =0; right < n; right++){
            sum += nums[right];
            while(sum >= target){
                minLen = Math.min(right-left+1,minLen);
                sum -= nums[left++];
            }
        }
        return minLen == Integer.MAX_VALUE ? 0 : minLen;
    }
}  

复杂度分析

**时间复杂度:**O(n)。n是数组的长度。指针 left 和 right 最多各移动一次。

**空间复杂度:**O(1)。

相关推荐
小羊没烦恼!1 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
倒头就睡的小比特1 天前
算法竞赛C++常用的STL
c++·算法
俊昭喜喜里1 天前
java中的继承和多态的区别
java
小羊没烦恼!1 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
譕痕1 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码1 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖1 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时1 天前
01-06-A-JVM排查实战详解
java·jvm
猎头南楼1 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
vipxieliang1 天前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot