LeetCode题练习与总结:长度最小的子数组--209

2024-08-28 12:52

本文主要是介绍LeetCode题练习与总结:长度最小的子数组--209,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、题目描述

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度如果不存在符合条件的子数组,返回 0 。

示例 1:

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

示例 2:

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

示例 3:

输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0

提示:

  • 1 <= target <= 10^9
  • 1 <= nums.length <= 10^5
  • 1 <= nums[i] <= 10^5

二、解题思路

这是一个典型的滑动窗口问题。滑动窗口是一种常用的处理数组或链表问题的技术,它通过两个指针(通常称为快指针和慢指针)来维护一个窗口。在这个问题中,我们使用滑动窗口来找到长度最小的子数组,其元素之和大于等于目标值 target

步骤如下:

  1. 初始化两个指针 left 和 right,它们都指向数组的开始位置。
  2. 初始化一个变量 sum 用于记录当前窗口内的元素和。
  3. 初始化一个变量 minLength 用于记录满足条件的最小子数组长度,初始值可以设为 Integer.MAX_VALUE
  4. 使用 right 指针遍历数组,每次将 nums[right] 加到 sum 上。
  5. 当 sum 大于等于 target 时,更新 minLength 为当前窗口大小(即 right - left + 1),然后尝试通过将 left 指针向右移动来缩小窗口,同时更新 sum
  6. 当 right 指针遍历完数组后,如果 minLength 仍然是 Integer.MAX_VALUE,说明没有找到满足条件的子数组,返回 0;否则返回 minLength

三、具体代码

class Solution {public int minSubArrayLen(int target, int[] nums) {int left = 0;int sum = 0;int minLength = Integer.MAX_VALUE;for (int right = 0; right < nums.length; right++) {sum += nums[right]; // 将当前元素加到sum上// 当sum大于等于target时,尝试缩小窗口while (sum >= target) {minLength = Math.min(minLength, right - left + 1); // 更新最小长度sum -= nums[left]; // 从sum中减去left指针指向的元素left++; // left指针右移}}// 如果minLength没有被更新,返回0;否则返回minLengthreturn minLength == Integer.MAX_VALUE ? 0 : minLength;}
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • right 指针遍历数组一次,其操作是线性的,时间复杂度为 O(n),其中 n 是数组 nums 的长度。
  • 对于每个 right 指针的位置,left 指针最多只会从数组的起始位置移动到 right 指针的位置,因此对于每个 right 指针的位置,left 指针的操作也是线性的。
  • 由于 left 指针在遍历过程中不会超过 right 指针,因此 left 指针的总移动次数不会超过 n,即 left 指针的总操作次数是 O(n)。
  • 综合以上两点,总的时间复杂度是 O(n) + O(n) = O(n)。
2. 空间复杂度
  • leftrightsum 和 minLength 都是固定数量的整型变量,它们占用常数空间,空间复杂度为 O(1)。
  • 该算法没有使用任何与输入数组大小相关的数据结构,如额外的数组或集合。
  • 因此,总的空间复杂度是 O(1)。

五、总结知识点

  • 数组遍历

    • 使用 for 循环来遍历数组 nums 的所有元素。
  • 指针操作

    • 使用两个指针 left 和 right 来表示滑动窗口的左右边界。
    • right 指针用于扩展窗口,left 指针用于收缩窗口。
  • 累加和

    • 使用变量 sum 来存储当前窗口内所有元素的和。
  • 最小值更新

    • 使用 Math.min() 方法来更新 minLength,以找到满足条件的最小子数组长度。
  • 条件判断

    • 使用 while 循环来判断当前窗口的元素和是否大于等于 target,并在满足条件时收缩窗口。
  • 整数比较

    • 使用 Integer.MAX_VALUE 来初始化 minLength,这是一个常用的技巧,用于在没有找到满足条件的子数组时返回 0。
  • 逻辑运算

    • 使用三元运算符 ?: 来决定返回值,如果 minLength 没有被更新(仍然是 Integer.MAX_VALUE),则返回 0;否则返回 minLength

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

这篇关于LeetCode题练习与总结:长度最小的子数组--209的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1114819

相关文章

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

Java中数组与栈和堆之间的关系说明

《Java中数组与栈和堆之间的关系说明》文章讲解了Java数组的初始化方式、内存存储机制、引用传递特性及遍历、排序、拷贝技巧,强调引用数据类型方法调用时形参可能修改实参,但需注意引用指向单一对象的特性... 目录Java中数组与栈和堆的关系遍历数组接下来是一些编程小技巧总结Java中数组与栈和堆的关系关于

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

Spring Boot 与微服务入门实战详细总结

《SpringBoot与微服务入门实战详细总结》本文讲解SpringBoot框架的核心特性如快速构建、自动配置、零XML与微服务架构的定义、演进及优缺点,涵盖开发环境准备和HelloWorld实战... 目录一、Spring Boot 核心概述二、微服务架构详解1. 微服务的定义与演进2. 微服务的优缺点三

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优