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

Leetcode 长度最小的子数组


这段代码实现了一个解决“长度最小的子数组”问题的Java解决方案,采用了滑动窗口的算法思想。下面是详细的中文解释:

算法思想:

  1. 滑动窗口:该算法利用了滑动窗口的思想,窗口的左右边界分别用变量 leftright 来表示。right 向右移动遍历数组中的每个元素,不断扩大窗口,直到窗口内的元素和达到或超过目标值 target

  2. 窗口内求和:我们定义了一个 sum 变量来记录当前窗口内元素的和。每当 right 向右移动时,将当前 nums[right] 的值加入到 sum 中。

  3. 缩小窗口:当 sum 达到或超过 target 时,表示当前窗口(从 leftright)满足条件,即窗口内的元素和大于等于 target。这时候,我们尝试通过增大 left 的值来缩小窗口,从而找到符合条件的最小长度子数组。

    • 在缩小窗口时,我们每次计算当前窗口的长度,并更新 minLengthminLength 和当前窗口长度之间的最小值。
    • 然后,从 sum 中减去 nums[left] 的值,并将 left 向右移动一个位置,以继续寻找更小的符合条件的子数组。
  4. 最终结果:遍历完整个数组后,如果 minLength 仍然是初始值 Integer.MAX_VALUE,说明没有找到符合条件的子数组,返回 0。否则,返回 minLength,即符合条件的最小子数组的长度。

时间复杂度:

该算法的时间复杂度为 (O(n)),因为每个元素最多被处理两次(一次是被 right 指针添加进窗口,另一次是被 left 指针移出窗口)。

总结:

  • 使用滑动窗口逐步扩大和缩小窗口,确保在满足条件的同时,找到最小长度的子数组。
  • 如果不存在满足条件的子数组,返回 0;否则返回最小长度。

java solution

class Solution {public int minSubArrayLen(int target, int[] nums) {int left = 0;int sum = 0; //初始化窗口内的和int minLen = Integer.MAX_VALUE;//右边界遍历数组for(int right = 0; right < nums.length; right++) {//逐渐尝试求和sum += nums[right];//当 sum >= target 时,尝试缩小窗口while(sum >= target) {minLen = Math.min(minLen, right - left + 1);sum -= nums[left];//将左边界的值从sum中减去left++; //移动左边界,缩小窗口}}return minLen == Integer.MAX_VALUE ? 0 : minLen;}
}

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

相关文章:

  • AndroidStudio 加载grade失败问题解决
  • 工业相机常用功能之白平衡及C++代码分享
  • 【CSS】“flex: 1“有什么用?
  • Ethernet 系列(8)-- 基础学习::ARP
  • 简单又便宜的实现电脑远程开机唤醒方法
  • 软件著作权申请教程(超详细)(2024新版)软著申请
  • 06 Oracle性能优化秘籍:AWR、ASH、SQL trace与实时监控的实战指南
  • git基础操作
  • Python的函数
  • CDN到底是什么?
  • C++算法探索:从排序到动态规划
  • java卷上天,转行可以干什么?
  • 声纹识别中,向量距离那种计算方式最合适
  • aLoNg3x.2 | CrackMe
  • Servlet-Filter
  • Linux 常用操作指令大揭秘(上)
  • PaddleOCR安装教程
  • 一文读懂肖特基二极管
  • C#语言:现代软件开发的核心工具
  • 数据结构_哈夫曼树及其应用
  • 智慧矿山建设方案
  • Github的OAuth2登录
  • 块存储、文件存储和对象存储详细介绍
  • 自制头文件:BetterPrint(更好的输出)
  • 首批入驻 | ZStack AIOS平台智塔入驻信通院“铸基计划”应用商店
  • 【Qt】Macbook M1下载安装