当前位置: 首页 > article >正文

[数组二分查找] 0209. 长度最小的子数组

文章目录

      • 1. 题目链接
      • 2. 题目大意
      • 3. 示例
      • 4. 解题思路
      • 5. 参考代码

1. 题目链接

209. 长度最小的子数组 - 力扣(LeetCode)



2. 题目大意

描述:给定一个只包含正整数的数组 nums 和一个正整数 target。

要求:找出数组中满足和大于等于 target 的长度最小的「连续子数组」,
并返回其长度。如果不存在符合条件的子数组,返回 0。

说明

  • 1≤target≤109。
  • 1≤nums.length≤105。
  • 1≤nums[i]≤105。


3. 示例

输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。

输入:target = 4, nums = [1,4,4]
输出:1



4. 解题思路

最直接的做法是暴力枚举,时间复杂度为 O(n2)。但是我们可以利用滑动窗口的方法,在时间复杂度为 O(n) 的范围内解决问题。

用滑动窗口来记录连续子数组的和,设定两个指针:left、right,分别指向滑动窗口的左右边界,保证窗口中的和刚好大于等于 target。

  1. 一开始,left、right 都指向 0。
  2. 向右移动 right,将最右侧元素加入当前窗口和 window‾sum 中。
  3. 如果 window‾sum≥target,则不断右移 left,缩小滑动窗口长度,并更新窗口和的最小值,直到 window‾sum<target。
  4. 然后继续右移 right,直到 right≥len(nums) 结束。
  5. 输出窗口和的最小值作为答案。


5. 参考代码

class Solution {

    public int minSubArrayLen(int target, int[] nums) {
        int size = nums.length;
        int ans = size + 1; // 初始化为比数组长度大1的值,方便后续判断
        int left = 0;
        int right = 0;
        int windowSum = 0;

        while (right < size) {
            windowSum += nums[right];
            // 当窗口内的和大于等于目标值时,尝试缩小窗口
            while (windowSum >= target) {
                ans = Math.min(ans, right - left + 1);
                windowSum -= nums[left];
                left++;
            }
            right++;
        }

        return ans == size + 1 ? 0 : ans;
    }
}



http://www.kler.cn/a/402091.html

相关文章:

  • SSD固态硬盘删除文件基本无法恢复
  • 汽车安全再进化 - SemiDrive X9HP 与环景影像系统 AVM 的系统整合
  • STM32 使用 STM32CubeMX HAL库实现低功耗模式
  • 逆向攻防世界CTF系列41-EASYHOOK
  • 【JavaEE初阶 — 多线程】wait() notify()
  • 七、箭头函数及简写、arguments、剩余参数、展开运算符、解构数组与对象、数组常见方法(forEach、map、join、reduce)
  • Java程序基础③Java运算符+逻辑控制+循环结构+输入输出
  • Git配置与使用
  • 2022 年 9 月青少年软编等考 C 语言二级真题解析
  • 【LeetCode】167. 两数之和 II - 输入有序数组
  • MySQL —— explain 查看执行计划与 MySQL 优化
  • Swift从0开始学习 对象和类 day3
  • IDEA leetcode插件代码模板配置,登录闪退解决
  • 腾讯云软件源加速软件包下载安装和更新
  • 【FMC169】基于VITA57.1标准的4发4收射频子模块(基于ADRV9026)
  • ITSS服务经理: 山西科技学院智能铸造现代产业学院揭牌
  • 矩阵起源入选IDC《RAG与向量数据库市场前景预测》报告
  • ThinkPHP6的缓存机制
  • 线性数据结构
  • linux常用命令(文件操作)
  • windows C#-异步编程场景(一)
  • 【前端知识】Javascript前端框架Vue入门
  • 代码随想录算法训练营第五十一天|Day51 图论
  • 基于机器学习电信号EMG训练分类模型控制仿生手控制系统(Matlab-Simulink实现)
  • 使用Axios函数库进行网络请求的使用指南
  • 在spring boot工程中使用Filter时,@WebFilter 注解不生效的问题分析和解决方案