[LeetCode] 128. Longest Consecutive Sequence 解题思路

时间:2023-03-09 17:36:39
[LeetCode] 128. Longest Consecutive Sequence 解题思路

Given an unsorted array of integers, find the length of the longest consecutive elements sequence.

For example,
Given [100, 4, 200, 1, 3, 2],
The longest consecutive elements sequence is [1, 2, 3, 4]. Return its length: 4.

Your algorithm should run in O(n) complexity.

问题:给定一个无序数组,找出最长的连续序列,要求时间复杂度为 O(n) 。

一开始想到的是用先排序,再找结果,但是时间复杂度要求 O(n) ,使用排序会超时。

思索未果,再网上找到一个方案,借助 unordered_set 来实现。

将元素全部塞进 unordered_set 中。

取出 unordered_set 中的一个剩余元素 x ,找到 unordered_set 中 x 的全部前后相邻元素,并将 x 和相邻元素全部移除,此时能得到 x 的相邻长度。若 unordered_set 还有元素,则继续当前步骤。

在第二步中的所有相邻长度中,找出最大值便是原问题的解。

由于 unordered_set 是基于 hash_table 来实现的,所以每次插入、查找、删除都是 O(1),而全部元素只会 插入、查找、删除 1 次,所以整体复杂度是 O(n)。

     int longestConsecutive(vector<int>& nums) {

         unordered_set<int> theSet;
for (int i = ; i < nums.size(); i++) {
theSet.insert(nums[i]);
} int longest = ;
while (theSet.size() > ) { int tmp = *theSet.begin();
theSet.erase(tmp); int cnt = ; int tmpR = tmp + ;
while (theSet.count(tmpR)) {
cnt++;
theSet.erase(tmpR);
tmpR++;
} int tmpL = tmp - ;
while (theSet.count(tmpL)) {
cnt++;
theSet.erase(tmpL);
tmpL--;
} longest = max( longest, cnt); } return longest;
}

参考资料:

[LeetCode] Longest Consecutive Sequence, 喜刷刷