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

相关文章

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. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

MySQL 获取字符串长度及注意事项

《MySQL获取字符串长度及注意事项》本文通过实例代码给大家介绍MySQL获取字符串长度及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 获取字符串长度详解 核心长度函数对比⚠️ 六大关键注意事项1. 字符编码决定字节长度2

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa