最长连续序列

题目:最长连续序列

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
在这里插入图片描述

解题思路:

思路一:先排序,然后统计

class LongestConsecutive{
	/**
     * 计算给定数组中最长连续子序列的长度。
     * 首先对数组进行排序,以便通过比较相邻元素来找出连续序列。
     */
    public int longestConsecutive1(int[] nums) {
        // 数组长度
        int n = nums.length, res = 1, cnt = 1;

        // 对数组进行排序,以便后续比较相邻元素
        Arrays.sort(nums);

        // 遍历数组,寻找最长连续序列
        for(int i = 1;i < n;i++){
            // 如果当前元素与前一个元素连续,则增加当前序列长度
            if(nums[i] == nums[i - 1]+1){
                cnt++;
                // 更新最长序列长度
                res = Math.max(res, cnt);
            }else if(nums[i] == nums[i - 1]){
                // 如果当前元素与前一个元素相同,则继续遍历
                continue;
            }else{
                // 如果当前元素与前一个元素不连续,则重置当前序列长度
                cnt = 1;
            }
        }
        // 返回最长连续1序列的长度
        return res;
    }
}

思路二:使用并查集,如果元素相差为1,就把它合并到一个区间,具体看代码

class LongestConsecutive {
	// 因为数组中包含负值,所以采用map记录
    Map<Integer, Integer> roots = new HashMap<>();
    Map<Integer, Integer> sizes = new HashMap<>();
    
    /**
     * 计算给定数组中最长的连续子序列的长度。
     * 使用并查集数据结构来处理元素之间的连接关系,通过遍历数组两次来建立并查集,并计算最长子序列的长度。
     *
     * @param nums 输入的整数数组,其中包含可能包含重复元素和零的整数。
     * @return 返回数组中最长连续子序列的长度。
     */
    public int longestConsecutive(int[] nums) {
        /* 数组长度 */
        int n = nums.length;
        /* 最长连续子序列的长度 */
        int res = 0;

        /* 初始化并查集,将每个元素作为一个单独的集合 */
        for(int i : nums){
            roots.put(i, i);
            sizes.put(i, 1);
        }

        /* 遍历数组,尝试连接每个元素与其后继元素 */
        for(int i : nums){
            if(roots.containsKey(i + 1)){
                this.union(i, i + 1);
            }
        }

        /* 遍历数组,找出并查集中最大的集合大小,即最长连续子序列的长度 */
        for(int i : nums){
            if(sizes.get(i) != null)
                res = Math.max(res, sizes.get(i));
        }

        /* 返回最长连续子序列的长度 */
        return res;
    }


    /**
     * 查找并缩合并查找到的根节点。
     *
     * 该方法实现了并查集的查找操作,也称为“根查找”或“路径压缩”。
     * 它的目的是找到给定元素x所属的集合的根节点,并在查找过程中优化结构,减少后续查找的时间。
     *
     * @param x 要查找的元素
     * @return 元素x所属集合的根节点
     */
    public int find(int x){
        // 如果x就是自己的根节点,则直接返回x
        if(x == roots.get(x)) return x;
        // 否则,递归查找x的根节点,并将x直接指向它的根节点,以减少后续查找的深度
        roots.put(x, find(roots.get(x)));
        return roots.get(x);
    }


    /**
     * 将两个元素所在的集合合并为一个集合。
     *
     * 此方法用于并查集数据结构中,通过查找两个元素的根节点,并将其中一个根节点指向另一个根节点,
     * 从而合并两个集合。如果两个元素已经在同一个集合中,则不进行任何操作。
     *
     * @param i 第一个元素的索引
     * @param j 第二个元素的索引
     */
    public void union(int i, int j){
        // 分别查找元素i和j的根节点
        int x = find(i);
        int y = find(j);
        // 如果元素i和j的根节点不同,才进行合并操作
        if(x != y){
            roots.put(x, y);
            // 合并集合时,将小集合的大小加到大集合的大小上
            sizes.put(y, sizes.get(y) + sizes.get(x));
        }
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/709848.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

49.Chome浏览器有三种清缓存方式

49.Chome浏览器有三种清缓存方式&#xff1a;正常重新加载、硬件重新加载、清空缓存并硬性重新加载 1、【正常重新加载】 触发方式&#xff1a;①F5  ②CtrlR  ③在地址栏上回车  ④点击链接 如果缓存不过期会使用缓存。这样浏览器可以避免重新下载JavaScript文件、图像、…

如何应对生活中的不确定性:仁者安仁,知者利仁。

有较高自尊水平的人&#xff0c;接近于孔子说的&#xff1a;仁者。 ——— 有着稳定的高自尊&#xff0c;无论外在环境如何变化&#xff0c;对其影响都不大&#xff0c;他能够愉快地生活。 相反&#xff1a;一个人处于低自尊状态&#xff0c;就会活得很痛苦&#xff0c;对自己…

Visual Studio Code连接VMware虚拟机

1.安装VS Code插件 在拓展中安装插件 Remote-SSH 2.在虚拟机中安装OpenSSH服务器 使用超级用权限(root)更新软件包列表&#xff0c;Debian系统和Ubuntu系统使用apt包管理工具&#xff1a; sudo apt update CentOS系统使用yum或dnf包管理工具&#xff1a; sudo yum update …

LeetCode | 434.字符串中的单词数

这道题直接使用语言内置的 split 函数可直接分离出字符串中的每个单词&#xff0c;但是要注意区分两种情况&#xff1a;1、空串&#xff1b;2、多个空格连续&#xff0c;分割后会出现空字符的情况&#xff0c;应该舍弃 class Solution(object):def countSegments(self, s):&qu…

C++青少年简明教程:C++的指针入门

C青少年简明教程&#xff1a;C的指针入门 说到指针&#xff0c;就不可能脱离开内存。了解C的指针对于初学者来说可能有些复杂&#xff0c;我们可以试着以一种简单、形象且易于理解的方式来解释&#xff1a; 首先&#xff0c;我们可以将计算机内存想象成一个巨大的有许多格子的…

论文阅读:H-ViT,一种用于医学图像配准的层级化ViT

来自CVPR的一篇文章&#xff0c;https://openaccess.thecvf.com/content/CVPR2024/papers/Ghahremani_H-ViT_A_Hierarchical_Vision_Transformer_for_Deformable_Image_Registration_CVPR_2024_paper.pdf 用CNNTransformer混合模型做图像配准。可变形图像配准是一种在相同视场…

windows上安装redis,并且用pycharm联通调用测试

在 Windows 上启动 Redis&#xff0c;官网版本不支持windows直接安装&#xff0c;你可以按照以下步骤进行操作&#xff1a; 使用Github Redis 版本启动 Redis 如果你想使用 Redis 在 Windows 上启动 Redis&#xff0c;以下是基本的步骤&#xff1a; 下载 Redis&#xff1a; 访…

Commons-Collections篇-CC4链分析

前言 因为 CommonsCollections4 除 4.0 的其他版本去掉了 InvokerTransformer 继承 Serializable&#xff0c;导致该方法无法序列化。 同时 CommonsCollections 4的版本 TransformingComparator 继承了 Serializable接口&#xff0c;而CommonsCollections 3里是没有的&#xf…

【中台】数字中台整体建设技术方案(doc原件获取)

1. 中台概念 2. 推动企业组织模式演进 3. 建设方法 4 .中台内容 5. 数据安全体系 中台内容围绕数据中台建设评估、整体框架、数据采集&#xff0c;结构化、半结构化、非结构化的数据采集&#xff0c;数据计算能力、存储计算引擎、数据架构、数据挖掘、各种不同数据层建设、模型…

火爆全网《pvz植物大战僵尸杂交版》最新安装包,支持Android、Windows、iOS!

我是阿星&#xff0c;今天跟大家聊聊最近在B站火得一塌糊涂的老游戏——《植物大战僵尸》。你没听错&#xff0c;就是那个曾经让我们熬夜奋战&#xff0c;一关又一关的游戏。 话说回来&#xff0c;这游戏怎么就突然又火起来了呢&#xff1f; 原来&#xff0c;是因为它的最新整…

54.Python-web框架-Django-免费模板django-datta-able

1.Datta Able Django介绍 Detta Able Djiango是什么 Datta Able Django 是一个由AppSeed提供的开源Django管理面板&#xff0c;基于现代设计&#xff0c;为开发者提供了一流的功能和优雅的界面。它源自CodedThemes的高风格化Bootstrap 4模板——Datta Able Bootstrap Lite&…

手机在网状态-手机在网状态查询-手机在网站状态接口

查询手机号在网状态&#xff0c;返回正常使用、停机、未启用/在网但不可用、不在网&#xff08;销号/未启用/异常&#xff09;、预销户等多种状态 直连三大运营商&#xff0c;实时更新&#xff0c;可查询实时在网状态 高准确率-实时更新&#xff0c;准确率99.99% 接口地址&…

MySQL与PostgreSQL关键对比四(关联查询性能)

引言&#xff1a;MySQL单表的数据规模一般建议在百万级别&#xff0c;而PostgreSQL的单表级别一般可以到亿级&#xff0c;如果是MPP版本就会更多。从基础数据建议上&#xff0c;不难看出&#xff0c;MySQL在Join的情况下也就是主要查询的情况下性能和PostgreSQL相差还是很大的。…

Minecraft模组开发(fabric)之准备工作

Minecraft模组开发&#xff08;fabric&#xff09;之准备工作 最近心血来潮想开发个Minecraft的模组&#xff0c;一边学习一边开发&#xff0c;顺带着将一些步骤、学习心得整理下来。之所以选择fabric&#xff0c;是因为自己的光影包使用的是iris-fabric&#xff0c;所以就想着…

蓝牙耳机怎么连接电脑?轻松实现无线连接

蓝牙耳机已经成为许多人生活中不可或缺的一部分&#xff0c;不仅可以方便地连接手机&#xff0c;还能轻松连接电脑&#xff0c;让我们在工作和娱乐时享受无线的自由。然而&#xff0c;对于一些用户来说&#xff0c;将蓝牙耳机与电脑连接可能会遇到一些问题。本文将介绍蓝牙耳机…

[Java基本语法] 抽象类与接口

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;线程与…

SuperMap iClient3D 11i(2023) SP1 for Cesium 调整

SuperMap iClient3D 11i(2023) SP1 for Cesium 最新版本 下载地址 SuperMap技术资源中心|为您提供全面的在线技术服务 每一次版本升级,都要对代码进行修改调整,都是为了解决功能需求。当然,也为产品做了小白鼠测试,发现bug,优化功能。 由于前端开发使用的是dojo框架,类…

Node入门以及express创建项目

前言 记录学习NodeJS 一、NodeJS是什么&#xff1f; Node.js 是一个开源和跨平台的 JavaScript 运行时环境 二、下载NodeJs 1.下载地址(一直点击next即可&#xff0c;记得修改安装地址) https://nodejs.p2hp.com/download/ 2.查看是否安装成功&#xff0c;打开命令行 nod…

图像的几何变换之平移

文章目录 前言需求代码运行结果图 前言 图像的几何变换是一个再基础不过的知识点&#xff0c;包括等距变换&#xff0c;相似变换&#xff0c;仿射变换和投影变换。图像的几何变换是指对图像的位置&#xff0c;尺寸&#xff0c;大小&#xff0c;形状和投影进行变换&#xff0c;…

FastWeb - Lua开源跨平台网站开发服务

在网站开发领域&#xff0c;大家都熟知PHPStudy和宝塔这两款广受欢迎的工具&#xff0c;但今天我要介绍的是一款功能强大、支持跨平台的开源Lua网站开发服务——Fast Web&#xff0c;以及与之配套的网站管理器。 Fast Web简介 Fast Web是一款基于Lua编写的网站开发框架&#…