每日算法系列【LeetCode 128】最长连续序列

简介: 每日算法系列【LeetCode 128】最长连续序列

题目描述

给定一个未排序的整数数组,找出最长连续序列的长度。

要求算法的时间复杂度为 。

示例1

输入:
[100, 4, 200, 1, 3, 2]
输出:
4
解释:
最长连续序列是 [1, 2, 3, 4]。它的长度为 4。

题解

哈希表

因为题目要求  的时间复杂度,所以不能排序。

我们可以遍历每个数 ,假设它是某个连续序列的开头,那么首先要满足  不在数组中,然后从  开始逐渐增大,看最大多少还在数组里。

实现上查询数字在不在数组里可以采用哈希表,复杂度是  的。虽然看起来遍历每个数是  ,以它为开头逐渐增大又是  ,但是我们其实只会对开头的数遍历最大能达到多少。这样两层循环总的遍历次数其实还是  的。

总的时间复杂度就是  。

并查集

我们可以把任意两个相差为  的数之间连上边,那么数组就变成了若干个子树,我们只需要求结点数量最多的那个子树就行了。

用并查集可以实现连接两个连续序列,合并成一个连续序列,并且快速查询这个序列长度是多少。

首先初始的时候,数组中的每个数都自成一个子树(它自己就是根结点)。然后遍历每一个数  ,如果  也在数组中,那就合并这两个数所在的子树,并且统计合并后的子树大小。

总的时间复杂度也是  。

代码

哈希表(c++)

class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        unordered_map<int, int> mp;
        for (auto x : nums) mp[x] = 1;
        int res = 0;
        for (auto x : nums) {
            if (mp.count(x-1)) continue;
            int y = x;
            while (mp.count(++y));
            res = max(res, y-x);
        }
        return res;
    }
};

并查集(c++)

class Solution {
public:
    unordered_map<int, int> fa, cnt;
    int find(int x) {
        return x==fa[x] ? x : fa[x]=find(fa[x]);
    }
    int merge(int x, int y) {
        x = find(x);
        y = find(y);
        if (x == y) return cnt[x];
        fa[y] = x;
        cnt[x] += cnt[y];
        return cnt[x];
    }
    int longestConsecutive(vector<int>& nums) {
        if (!nums.size()) return 0;
        for (auto x : nums) {
            fa[x] = x;
            cnt[x] = 1;
        }
        int res = 1;
        for (auto x : nums) {
            if (fa.count(x+1)) {
                res = max(res, merge(x, x+1));
            }
        }
        return res;
    }
};
相关文章
|
2月前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
207 80
|
4月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
58 0
|
2月前
|
机器学习/深度学习 算法
基于遗传优化的双BP神经网络金融序列预测算法matlab仿真
本项目基于遗传优化的双BP神经网络实现金融序列预测,使用MATLAB2022A进行仿真。算法通过两个初始学习率不同的BP神经网络(e1, e2)协同工作,结合遗传算法优化,提高预测精度。实验展示了三个算法的误差对比结果,验证了该方法的有效性。
|
3月前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
4月前
|
算法
每日一道算法题(Leetcode 20)
每日一道算法题(Leetcode 20)
47 2
|
4月前
|
算法
动态规划算法学习四:最大上升子序列问题(LIS:Longest Increasing Subsequence)
这篇文章介绍了动态规划算法中解决最大上升子序列问题(LIS)的方法,包括问题的描述、动态规划的步骤、状态表示、递推方程、计算最优值以及优化方法,如非动态规划的二分法。
101 0
动态规划算法学习四:最大上升子序列问题(LIS:Longest Increasing Subsequence)
|
5月前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
318 19
|
5月前
|
算法 数据可视化 数据安全/隐私保护
基于LK光流提取算法的图像序列晃动程度计算matlab仿真
该算法基于Lucas-Kanade光流方法,用于计算图像序列的晃动程度。通过计算相邻帧间的光流场并定义晃动程度指标(如RMS),可量化图像晃动。此版本适用于Matlab 2022a,提供详细中文注释与操作视频。完整代码无水印。
|
6月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
79 6
|
6月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
68 1