[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_OC8 分钟前
LC 3 无重复字符的最长子串:从入门滑动窗口到优化写法,再也不怕面试官追问
javascript·算法·leetcode
Slow菜鸟12 分钟前
第3篇:实操落地篇 · 3套企业标准工作流(IDEA可视化版)
java·ide·intellij-idea
weixin_4407841113 分钟前
Java基础常见题
java·开发语言·python·java基础
掉鱼的猫19 分钟前
Hot-Plug 实战:运行期管理 Solon 插件
java·hotfix
(Charon)26 分钟前
【C++】多线程死锁:产生原因、复现与解决方法
开发语言·c++·算法
markinmarkin34 分钟前
Spring 中有哪些方式可以把Bean 注入到IOC 容器?
java·spring
带刺的坐椅1 小时前
Hot-Plug 实战:运行期管理 Solon 插件
java·solon·插件·热插拔
大黄说说1 小时前
SQL Server 执行计划怎么看?快速定位 SQL 慢的根源
java·linux·数据库
lucas_AI1 小时前
ConfBench:大模型的「我很有把握」,到底能不能信?
人工智能·算法
oier_Asad.Chen1 小时前
【洛谷题解/AcWing题解/真题】洛谷P2330【SCOI2005】繁忙的都市(Kruskal算法的再探究))
c++·算法·贪心算法·图论·最小生成树·kruskal