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

相关文章

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

Python中连接不同数据库的方法总结

《Python中连接不同数据库的方法总结》在数据驱动的现代应用开发中,Python凭借其丰富的库和强大的生态系统,成为连接各种数据库的理想编程语言,下面我们就来看看如何使用Python实现连接常用的几... 目录一、连接mysql数据库二、连接PostgreSQL数据库三、连接SQLite数据库四、连接Mo

Git提交代码详细流程及问题总结

《Git提交代码详细流程及问题总结》:本文主要介绍Git的三大分区,分别是工作区、暂存区和版本库,并详细描述了提交、推送、拉取代码和合并分支的流程,文中通过代码介绍的非常详解,需要的朋友可以参考下... 目录1.git 三大分区2.Git提交、推送、拉取代码、合并分支详细流程3.问题总结4.git push

Kubernetes常用命令大全近期总结

《Kubernetes常用命令大全近期总结》Kubernetes是用于大规模部署和管理这些容器的开源软件-在希腊语中,这个词还有“舵手”或“飞行员”的意思,使用Kubernetes(有时被称为“... 目录前言Kubernetes 的工作原理为什么要使用 Kubernetes?Kubernetes常用命令总

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

Java向kettle8.0传递参数的方式总结

《Java向kettle8.0传递参数的方式总结》介绍了如何在Kettle中传递参数到转换和作业中,包括设置全局properties、使用TransMeta和JobMeta的parameterValu... 目录1.传递参数到转换中2.传递参数到作业中总结1.传递参数到转换中1.1. 通过设置Trans的