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

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

描述

给定一个长度为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。

代码:

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 变量中存储的就是最长无重复元素子数组的长度。方法返回这个值。

代码:

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.kler.cn/news/316615.html

相关文章:

  • ArcGIS Pro SDK (十六)公共设施网络 1 网络管理
  • 人工智能与机器学习原理精解【22】
  • 深度学习-16-深入理解BERT基于本地数据微调训练文本分类模型的流程
  • SQL语法学习指南
  • 9月23日
  • Shiro rememberMe反序列化漏洞(Shiro-550) 靶场攻略
  • 水下攻防面试题
  • 『功能项目』QFrameWork拾取道具UGUI【69】
  • 深度学习速通系列:什么是文本数据标注
  • 《SmartX ELF 虚拟化核心功能集》发布,详解 80+ 功能特性和 6 例金融实践
  • 高级大数据开发协会
  • PHP邮件发送教程:如何用PHP发送电子邮件?
  • 4.结构型设计模式 - 第1回:引言与适配器模式 (Adapter Pattern) ——设计模式入门系列
  • Vulkan 学习(8)---- vkImageView 创建
  • 关于SpringBoot项目使用maven打包由于Test引起的无法正常打包问题解决
  • 亲测好用,ChatGPT 3.5/4.0新手使用手册~
  • 振弦式渗压计常见故障有哪些?怎么解决?
  • 探秘淘宝商品详情原数据:主图与数据的神秘获取之旅
  • 盲盒扭蛋机系统开发源码部署
  • LeetCode 滑动窗口 每个字符最多出现两次的最长子字符串
  • 中小微企业生产管理利器-- 超轻量生产工单系统
  • 微信支付开发-后台统计工厂实现
  • 优化SQL查询的常见方法
  • FPGA随记——VIVADO中ASYNC_REG指令
  • 解决Echarts:宽度100%,渲染的宽度却是100px
  • Vue3快速入门+axios的异步请求(基础使用)
  • 基于SpringBoot的旅游网站系统
  • 硬盘数据能否自己在家恢复?探索数据恢复的可行性与方法
  • 信息技术引领的智能化未来
  • 滚雪球学SpringCloud[5.3讲]: 配置管理中的高可用与容错