[Java][Leetcode middle] 209. 长度最小的子数组

暴力法

会超时

管解1:前缀和 + 二分查找

o NlogN

计算前缀和是为了便捷计算i,j之间的元素和(sumsj - sumsi

java 复制代码
class Solution {
    public int minSubArrayLen(int target, int[] nums) {
          // 前缀和、二分查找
          int n = nums.length;

          int res = Integer.MAX_VALUE;

          // 计算前缀和
          int[] sums = new int[n+1];
          for(int i=1;i<=n;i++){
             sums[i] = sums[i-1] + nums[i-1];
          }

          //  sums[j] -  sums[i] >= s
          for(int i=1; i<=n; i++){
              int j = target + sums[i-1];
              int bound = Arrays.binarySearch(sums, j);
              
              // 如果无法找到,返回 -(插入点)-1
              if(bound < 0){
                 bound = - bound - 1;
              }

              if(bound <= n){
                  res = Math.min(res, bound - (i  - 1) );
              }
          }
      return res == Integer.MAX_VALUE ? 0 : res;
    }
}

管解2:滑动窗口

o N

设置一个滑动窗口:

  • 首先开始时,start、end都指向第一个元素
  • 开始增加end,直到>=target, 满足条件,记录最小结果
  • 逐步增加start(缩短窗口),如果满足条件>=target,继续记录比较最小结果。
java 复制代码
class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int n = nums.length;
        if(n == 0) return 0;
        int res = Integer.MAX_VALUE;

        int start = 0,end = 0;
        int sum = 0;
        while( end < n){
            sum += nums[end];

            while(sum >= target){
                res = Math.min(res, end - start + 1);

                sum -= nums[start];
                start++;
            }

            end++;
        }

        return res == Integer.MAX_VALUE ? 0 : res;
    }
}
相关推荐
To_OC11 小时前
LC 994 腐烂的橘子:人人都说是 BFS 入门题,我却写了三遍才过
javascript·算法·leetcode
金銀銅鐵15 小时前
[Python] 扩展欧几里得算法
python·数学·算法
狼爷15 小时前
吃透 Java Function 接口,搞定 99% 的 Stream 场景
java·函数式编程
To_OC17 小时前
LC 200 岛屿数量:经典 DFS 入门题,我第一次写居然连方向都搞错了
javascript·算法·leetcode
祎雪双十Gy19 小时前
从 DataX 的配置加载说起:我用 FastJson2 做了一个轻量级动态配置管理库
java·后端
小锋java123419 小时前
分享一套锋哥原创的SpringBoot4+Vue3宠物领养网站系统
java
考虑考虑1 天前
Java实现hmacsha1加密算法
java·后端·java ee
掉鱼的猫1 天前
Spring Boot → Solon 注解迁移实战指南:一张对照表说清楚
java·spring boot
plainGeekDev1 天前
广播接收器 → Flow + Lifecycle
android·java·kotlin
plainGeekDev1 天前
EventBus → SharedFlow
android·java·kotlin