LeetCode[128]最长连续序列

news2024/11/28 19:31:48

难度:中等

题目:

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

示例 1:

输入:nums = [100,4,200,1,3,2]

输出:4

解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。


示例 2:

输入:nums = [0,3,7,2,5,8,4,6,0,1]

输出:9


提示:

  • 0 <= nums.length <= 105

  • -109 <= nums[i] <= 109


Related Topics

  • 并查集

  • 数组

  • 哈希表


重点!!!解题思路

第一步:

明确解题手段
这种求连续的类似于连通性问题可使用并查集来解决

第二步:

题目中说以O(n)来解决此题,也就是说一次遍历来解决
原数组并未排序,所以我们要想一次遍历解决只能使用map集合帮助我们
例子中大部分差值为1,
所以,我们遍历数组发现map中有和当前值相差1的数,
就用并查集把它们两个连接起来。

第三步:

要求返回最长连续序列,即并查集中每个连通分量的大小
使用max方法逐一比较即可

源码:

class UnionFind {
    //记录每个节点的根节点
    int[] parent;
    //记录每个子集的节点数
    int[] rank;
    //记录并查集中的联通分量数量
    int count;

    public UnionFind(int n){
        count=n;
        parent=new int[n];
        for (int i=0;i<n;i++){
            parent[i]=i;
        }
        rank=new int[n];
        Arrays.fill(rank,1);
    }

    //路径压缩
    public int find(int ind){
        if (parent[ind]!=ind){
            parent[ind]=find(parent[ind]);
        }
        return parent[ind];
    }

    //按秩合并
    public void unite(int ind1,int ind2){
        int root1=find(ind1),root2=find(ind2);
        if (root1!=root2){
            if (rank[root1]<rank[root2]){
                int temp=root2;
                root2=root1;
                root1=temp;
            }
            parent[root2]=root1;
            rank[root1]+=rank[root2];
            count--;
        }
    }

    public int getCount(){
        return count;
    }
    public boolean connected(int ind1,int ind2){
        return find(ind1)==find(ind2);
    }
}
class Solution {
    public int longestConsecutive(int[] nums) {
        int ans=0;
        HashMap<Integer,Integer> map = new HashMap<>();

        UnionFind uf = new UnionFind(nums.length);
        for (int i = 0; i < nums.length; i++) {
            if (map.containsKey(nums[i])) continue;
            if (map.containsKey(nums[i]-1)){
                uf.unite(i,map.get(nums[i]-1));
            }
            if (map.containsKey(nums[i]+1)){
                uf.unite(i,map.get(nums[i]+1));
            }
            map.put(nums[i],i);
        }
        for (int i=0;i<nums.length;i++){//因为每个连通分量的根节点表示这个连通分量的总大小,所以没访问到根节点就跳过
            if (uf.find(i)!=i) continue;
            ans=Math.max(uf.rank[i],ans);
        }
        return ans;
    }
}

运行结果:

如果您还有什么疑问或解答有问题,可在下方评论,我会及时回复。

系列持续更新中,点个订阅吧

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java中new的含义如何理解?

在Java中&#xff0c;new关键字被使用来创建一个新的对象&#xff0c;可以理解为创建的意思。使用关键字new来创建一个对象也叫类的实例化&#xff0c;使用new创建对象时&#xff0c;会调用构造方法初始化对象声明对象Cat cat 在栈内存中实例化对象 new Cat(参数); 在堆内存中每…

C++:类的static成员,友元和构造函数初始化列表

目录 一.类的构造函数的初始化列表 1.类的构造函数初始化列表的引入和介绍 2.初始化列表用于类的类对象成员的拷贝构造函数的调用 3.初始化列表的使用细则 4.使用初始化列表的一个注意事项 二.explicit关键字 三.C类的static成员 1.类中static修饰的成员变量 2.类中st…

Lesson 4.2 逻辑回归参数估计:极大似然估计、相对熵与交叉熵损失函数

文章目录一、逻辑回归参数估计基本思路1. 构建损失函数2. 损失函数求解二、利用极大似然估计进行参数估计三、熵、相对熵与交叉熵1. 熵&#xff08;entropy&#xff09;的基本概念与计算公式2. 熵的基本性质3. 相对熵&#xff08;relative entropy&#xff09;与交叉熵&#xf…

LeetCode[947]移除最多的同行或同列石头

难度&#xff1a;中等题目&#xff1a;n块石头放置在二维平面中的一些整数坐标点上。每个坐标点上最多只能有一块石头。如果一块石头的 同行或者同列 上有其他石头存在&#xff0c;那么就可以移除这块石头。给你一个长度为 n的数组 stones&#xff0c;其中 stones[i] [xi, yi]…

MATLAB算法实战应用案例精讲-【人工智能】Grover量子搜索算法(补充篇)

前言 因为量子计算的并行性, 搜索问题, 比如说数据库搜索, 最短路径问题, 加密问题, 图形着色问题等, 都被视为可以做到量子加速. Grover 算法,有时也称为量子搜索算法(quantum search algorithm),指一种在量子计算机上运行的非结构化搜索算法,是量子计算的典型算法…

LeetCode[765]情侣牵手

难度&#xff1a;困难题目&#xff1a;n对情侣坐在连续排列的 2n个座位上&#xff0c;想要牵到对方的手。人和座位由一个整数数组 row表示&#xff0c;其中 row[i]是坐在第 i 个座位上的人的 ID。情侣们按顺序编号&#xff0c;第一对是 (0, 1)&#xff0c;第二对是 (2, 3)&…

#A. Balanced Lineup排队(rmq模板题)

题目思路建议先看看详解rmq问题很明显这道题意是跟你一段数列&#xff0c;并给出多次询问,询问区间内最大值和最小值的差。如果去暴力枚举显然会超时,所以要用st算法来解决。我们要建立两个RMQ预处理内容&#xff0c;分别处理最大值和最小值。建一个mx[i][j]代表从i开始,长度为…

精品图表Crack:TeeChart ActiveX version 2023.1

TeeChart ActiveX version 2023 数据可视化专家,Visual Studio.Net、Visual Basic、Visual Studio 6和 IIS / ASP的图表组件 概述 TeeChart Pro ActiveX 图表组件库提供数百种 2D 和 3D 图形样式、56 种数学和统计函数供您选择&#xff0c;以及无限数量的轴和 14 个工具箱组件…

DFS(五)最小轮盘锁

752. 打开转盘锁 你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字&#xff1a; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 。每个拨轮可以自由旋转&#xff1a;例如把 9 变为 0&#xff0c;0 变为 9 。每次旋转都只能旋转一个拨轮的一位数字。 锁的初始数字为 0000 &#xff0c;一…

【2023.01.26】定时执行专家 V6.6 兔年春节版 - 更新日志

目录 ◆ 最新版下载链接 ◆ 软件更新日志 – TimingExecutor Full Change Log ▼ 2023-01-23 V6.6 ▼ 2023-01-20 V6.5 ▼ 2022-12-25 V6.4 ▼ 2022-11-15 V6.3 ▼ 2022-10-01 V6.2 ▼ 2022-07-30 V6.1&#xff08;Build 769.30072022&#xff09; ▼ 2022-0…

Linux-Ubuntu入门到精通之远程操作指令

1️⃣shutdown 2️⃣查看或配置网卡信息 3️⃣网卡和IP地址 4️⃣ifconfig 5️⃣ping 6️⃣远程登录和复制文件 7️⃣ ssh 基础&#xff08;重点&#xff09; 8️⃣域名 和 端口号 9️⃣SSH 客户端的简单使用 1️⃣0️⃣Windows 下 SSH 客户端的安装 Putty &#xff1a;http:/…

数据结构 | 海量数据处理 | 位图和哈希切分的常见应用 | 布隆过滤器的使用场景

文章目录位图应用question 1question 2question 3位图的作用哈希切分布隆过滤器作为一种数据结构&#xff0c;哈希桶有着不同于其他数据结构的思想——直接映射&#xff0c;这使得在哈希结构中查找数据的效率达到了最快的O(1)&#xff0c;比起搜索树的比较数据大小&#xff0c;…

数学建模——降维算法

降维 降维的意义 降低无效、错误数据对建模的影响&#xff0c;提高建模的准确性少量切具有代表性的数据将大幅缩减挖掘所需的时间降低存储数据的成本 需要降维的情况 维度灾难。很难有一个简洁的模型在高维空间中依旧具有鲁棒性&#xff0c;而随着模型复杂度的增加&#xf…

【LeetCode每日一题:1663. 具有给定数值的最小字符串~~~递归+DFS+贪心】

题目描述 小写字符 的 数值 是它在字母表中的位置&#xff08;从 1 开始&#xff09;&#xff0c;因此 a 的数值为 1 &#xff0c;b 的数值为 2 &#xff0c;c 的数值为 3 &#xff0c;以此类推。 字符串由若干小写字符组成&#xff0c;字符串的数值 为各字符的数值之和。例如…

你会仲裁吗——劳动仲裁需要准备

目录 劳动仲裁申请书 仲裁思路 ​编辑 一、仲裁前准备 1、自己不认可年终奖 2、自己不认可绩效 二、【仲裁前】协商阶段 1、主张3个月足额年终奖 2、公司协商离职赔偿方案 年终奖仲裁证据 延时加班费 周末加班费 节假日加班费 其他福利-如房补 申请劳动仲裁交通…

uniapp组件传参方式梳理

前言 日常开发中经常会遇到组件之间传递参数问题,整理了几种常见的传参方式,方便日后复习梳理. 常见组件传参的三种方式: 1.父组件向子组件传参 2.子组件向父组件传参 3.子组件向非父组件传参 1.父组件向子组件传参自定义组件: <template><view c…

XPath入门

好久没用XPath了&#xff08;之前没做笔记&#xff09;&#xff0c;最近要用的时候又到处查。。。&#xff08;痛苦.jpg&#xff09;&#xff0c;还是记录下吧&#xff08;π_π&#xff09; XPath&#xff0c;是XML Path Language的缩写&#xff0c; 是一门在 XML 文档中查找…

【Linux】POSIX信号量

目录&#x1f308;前言&#x1f338;1、POSIX信号量&#x1f368;1.1、概念&#x1f367;1.2、PV操作&#x1f33a;2、POSIX信号量相关API&#x1f368;2.1、初始化和销毁信号量&#x1f367;2.2、等待信号量&#xff08;P&#xff09;&#x1f370;2.3、发布信号量&#xff08…

ImmutableList hessian2序列化失败问题分析

问题描述 A服务提供了个RPC接口给B服务使用&#xff0c;入参里有个参数是List类型&#xff0c;B服务在传参时使用Guava里的 ImmutableList&#xff0c;结果发生报错。 其中&#xff0c;B服务即consumer端的异常为&#xff1a;「com.alibaba.dubbo.remoting.RemotingException:…

AD采集之离散化概念(Quantizer模型使用介绍)

模拟量采集的PLC程序和功能块算法,可以参看下面的文章链接: PLC模拟量采集算法数学基础(线性传感器)_RXXW_Dor的博客-CSDN博客_模拟量采集线性校准模拟量采集库如何设计,具体算法代码请参看我的另一篇博文:PLC模拟量输入 模拟量转换FC:S_ITR_RXXW_BOSS的博客-CSDN博客_…