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

【LeetCode每日一题】LeetCode 209.长度最小的子数组

LeetCode 209.长度最小的子数组

题目描述

给定一个正整数数组 nums 和一个正整数 target,找出连续子数组的最小长度,使得子数组的和大于或等于 target。如果不存在符合条件的子数组,返回 0。

Java 实现代码

public class Solution {public int minSubArrayLen(int target, int[] nums) {int n = nums.length;int left = 0, sum = 0, minLength = Integer.MAX_VALUE;for (int right = 0; right < n; right++) {sum += nums[right]; // 扩展窗口,加入当前元素// 窗口内的和大于等于 target 时,尝试缩小窗口while (sum >= target) {minLength = Math.min(minLength, right - left + 1);sum -= nums[left]; // 移动左指针,缩小窗口left++;}}return minLength == Integer.MAX_VALUE ? 0 : minLength;}
}

解题思路

  1. 滑动窗口:使用两个指针 leftright 来表示当前窗口的边界,窗口的右边界逐步扩展,直到窗口内的和大于等于 target

  2. 窗口收缩:每当当前窗口的和大于等于 target 时,尝试通过移动左指针(即收缩窗口)来找到最小的符合条件的子数组。每次更新最小长度。

  3. 返回结果:在遍历完数组后,若未找到符合条件的子数组,则返回 0;否则返回最小长度。

复杂度分析

  • 时间复杂度:O(n),其中 n 是数组的长度。由于每个元素最多被访问两次(一次是右指针扩展,另一次是左指针收缩),因此时间复杂度是 O(n)。
  • 空间复杂度:O(1),只用了常数级别的额外空间。

举例说明执行过程

假设输入数组 nums = [2, 3, 1, 2, 4, 3]target = 7

  1. 初始化

    • left = 0, sum = 0, minLength = Integer.MAX_VALUE
  2. 遍历右指针

    • right = 0sum = 0 + nums[0] = 2sum = 2,不满足条件 sum >= 7,继续扩展。
    • right = 1sum = 2 + nums[1] = 5sum = 5,不满足条件 sum >= 7,继续扩展。
    • right = 2sum = 5 + nums[2] = 6sum = 6,不满足条件 sum >= 7,继续扩展。
    • right = 3sum = 6 + nums[3] = 8sum = 8,满足条件 sum >= 7,此时子数组为 [2, 3, 1, 2],长度为 4,更新 minLength = 4
  3. 收缩窗口

    • 由于满足 sum >= target,我们尝试通过移动 left 来缩小窗口:
    • left = 0sum = 8,缩小窗口,sum -= nums[0] = 8 - 2 = 6left = 1sum = 6,不满足 sum >= 7,继续扩展右指针。
  4. 继续遍历

    • right = 4sum = 6 + nums[4] = 10,满足 sum >= 7,此时子数组为 [3, 1, 2, 4],长度为 4,但 minLength 仍然保持 4。
  5. 收缩窗口

    • left = 1sum = 10,继续缩小窗口,sum -= nums[1] = 10 - 3 = 7,此时 sum >= target,子数组为 [1, 2, 4],长度为 3,更新 minLength = 3
  6. 继续遍历

    • right = 5sum = 7 + nums[5] = 10,满足 sum >= 7,此时子数组为 [1, 2, 4, 3],长度为 4,但 minLength 保持为 3。
  7. 收缩窗口

    • left = 2sum = 10,继续缩小窗口,sum -= nums[2] = 10 - 1 = 9,仍然满足 sum >= 7,子数组为 [2, 4, 3],长度为 3,minLength 保持为 3。
    • left = 3sum = 9,继续缩小窗口,sum -= nums[3] = 9 - 2 = 7,满足 sum >= 7,子数组为 [4, 3],长度为 2,更新 minLength = 2
  8. 结束遍历

    • 右指针已经遍历完整个数组,最终得到 minLength = 2

http://www.mrgr.cn/news/79758.html

相关文章:

  • java全栈day13-后端Web实战2
  • Pytest测试用例使用小结
  • 动态量化和静态量化
  • 【VUE2】纯前端播放海康视频录像回放,视频格式为rtsp格式,插件使用海康视频插件[1.5.4版本]
  • 作业Day1:思维导图、堆区申请空间并释放
  • Pointpillars模型转onnx
  • 彻底理解布隆过滤器怎么解决缓存穿透问题
  • vue-router查漏补缺
  • Linux高并发服务器开发 第一天(Linux的目录结构 cd用法 终端提示符格式)
  • List【Redis对象篇】
  • SAP Ariba Buying_Order Fulfillment Status
  • TDM-GCC 和 MinGW和Cygwin:Windows 下的开源 C/C++ 编译器
  • Python画泰勒图
  • 基于Springboot的实验室管理系统【附源码】
  • C++重点和练习
  • Flask使用长连接
  • 基于最新的Apache StreamPark搭建指南
  • vue3水波柱状图 ,实现
  • 设计模式的艺术读书笔记
  • AWK报告生成器