后端开发刷题 | 最长无重复子数组

news/2024/11/17 3:46:24/

描述

给定一个长度为n的数组arr,返回arr的最长无重复元素子数组的长度,无重复指的是所有数字都不相同。

子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组

数据范围:0≤arr.length≤105,0<arr[i]≤105

示例1

输入:

[2,3,4,5]

返回值:

4

说明:

[2,3,4,5]是最长子数组        

示例2

输入:

[2,2,3,4,3]

返回值:

3

说明:

[2,3,4]是最长子数组        

示例3

输入:

[9]

返回值:

1

示例4

输入:

[1,2,3,1,2,3,2,2]

返回值:

3

说明:

最长子数组为[1,2,3]       

示例5

输入:

[2,2,3,4,8,99,3]

返回值:

5

说明:

最长子数组为[2,3,4,8,99]

思路分析:

方法1:

该题可以使用队列来实现,因为队列先进先出,后进后出的特性,在遇到重复元素可以通过queue.poll()的方法把队头元素出队,使队列里面没有重复元素。

并且每添加一个元素,就比较最大值个数来更新res。

代码:

java">import java.util.*;public class Solution {/*** @param arr int整型一维数组 the array* @return int整型*/public int maxLength (int[] arr) {Queue<Integer> queue=new LinkedList<>();int res=0;for(int c:arr){while(queue.contains(c)){//如果有重复的元素,则让队头出队,一直到队列里面没有重复元素queue.poll();}//添加元素到队尾queue.add(c);res=Math.max(res,queue.size());}return res;}
}

思路分析:

方法2:

可以使用“滑动窗口”技术,是一种常用于解决数组/字符串中满足特定条件的子数组/子串问题的技术。在这个问题中,通过维护一个窗口(即左右指针之间的部分),并使用哈希集合来快速检查元素是否重复,我们能够高效地找到最长无重复元素子数组的长度。

步骤:

  1. 初始化变量
    • left 和 right 是两个整型指针,分别表示当前考虑的子数组的左右边界。初始时,它们都指向数组的第一个元素(即索引 0)。
    • max 用于记录迄今为止找到的最长无重复元素子数组的长度。初始值为 0。
    • set 是一个 HashSet,用于存储当前考虑的子数组中的元素,以便快速检查元素是否重复。
  2. 遍历数组
    • 使用一个 while 循环遍历数组 arr,条件是 right 指针小于数组的长度。这意味着只要 right 指针没有超出数组的范围,循环就会继续。
  3. 处理重复元素
    • 在每次循环中,首先检查 set 是否已经包含了 arr[right]。这是通过调用 set.contains(arr[right]) 来实现的。
    • 如果 set 包含 arr[right],说明当前考虑的子数组中出现了重复元素。此时,需要从子数组中移除左边界的元素(即 arr[left]),直到不再重复为止。这是通过循环调用 set.remove(arr[left++]) 来实现的,同时 left 指针向右移动。
  4. 添加元素并更新最长长度
    • 如果 set 不包含 arr[right],说明当前元素可以添加到子数组中。此时,将 arr[right] 添加到 set 中,并将 right 指针向右移动。
    • 然后,检查并更新 max 的值,以确保它始终表示当前找到的最长无重复元素子数组的长度。这是通过调用 max = Math.max(max, set.size()) 来实现的。注意,这里我们直接使用了 set.size() 来获取当前无重复元素子数组的长度。
  5. 返回结果
    • 当 right 指针超出数组范围时,循环结束。此时,max 变量中存储的就是最长无重复元素子数组的长度。方法返回这个值。

代码:

java">import java.util.*;public class Solution {/*** @param arr int整型一维数组 the array* @return int整型*/public int maxLength (int[] arr) {int left=0,right=0;Set<Integer> set=new HashSet<>();int max=0;while(right<arr.length){if(set.contains(arr[right])){set.remove(arr[left++]);}else{set.add(arr[right++]);max=Math.max(max,set.size());}}return max;}
}


http://www.ppmy.cn/news/1530852.html

相关文章

自动驾驶中的决策规划技术分享--轻舟智航

文章目录 0.概述&#xff1a;1 导航模块2 决策模块2.1 车道决策2.2 障碍物决策 3 轨迹规划3.1 时空分离规划3.2 时空联合规划 4 对比 0.概述&#xff1a; 李仁杰&#xff0c;轻舟智航规划算法负责人&#xff0c;自动驾驶决策与规划技术专家。 在自动驾驶系统中&#xff0c;决策…

SQLPlus执行成功但数据没有更新的原因及解决办法

在使用 sqlplus 执行 SQL 文件时&#xff0c;如果执行成功但数据没有更新&#xff0c;可能有以下几个原因导致&#xff1a; 1. 没有提交事务 在 Oracle 数据库中&#xff0c;执行 UPDATE, INSERT, DELETE 等操作后&#xff0c;默认不会自动提交事务。如果没有显式地提交事务&…

vue3 + ts + pnpm:nprogress / 页面顶部进度条

一、简介 nprogress 是一个轻量级的进度条库&#xff0c;它适用于在网页上添加顶部进度条&#xff0c;用于指示页面加载进度或任何长时间的运行过程。这个库非常流行&#xff0c;因为它易于使用且视觉效果很好。 二、安装 pnpm add nprogress 三、在使用的页面引入 / src/v…

(done) 声音信号处理基础知识(4) (Understanding Audio Signals for ML)

来源&#xff1a;https://www.youtube.com/watch?vdaB9naGBVv4 模拟信号特点如下 时域连续(x轴) 振幅连续(y轴) 如下是模拟信号的一个例子&#xff1a; 数字信号特点如下&#xff1a; 一个离散值序列 数据点的值域是一系列有限的值 ADC&#xff1a;模拟信号到数字信号的…

制作一个rabbitmq-sdk以及rabbitmq消费者实现定时上下线功能

目录结构 pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">&l…

JavaScript 学习

一、输出 为方便调试可以输出内容&#xff0c;但是用户是看不到的。要在开发者模式中看。 console . log ( "Hello" )&#xff1b; 二、外部文件引用 可以直接在html中写JS <head> <meta charset"utf-8"> <script> console.log("he…

利用 GlobalPointer 进行中文命名实体识别

利用 GlobalPointer 进行中文命名实体识别 在自然语言处理领域&#xff0c;命名实体识别&#xff08;NER&#xff09;是一个重要任务&#xff0c;它旨在识别文本中的特定信息单元&#xff0c;如人名、地名和组织名等。本文将详细分析使用 GlobalPointer 进行中文命名实体识别的…

甘肃非遗文化网站:Spring Boot开发实战

3 系统分析 当用户确定开发一款程序时&#xff0c;是需要遵循下面的顺序进行工作&#xff0c;概括为&#xff1a;系统分析–>系统设计–>系统开发–>系统测试&#xff0c;无论这个过程是否有变更或者迭代&#xff0c;都是按照这样的顺序开展工作的。系统分析就是分析系…