给定一个未排序的整数数组 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 <= 104
-109 <= nums[i] <= 109
使用哈希表方法求解。
#include <iostream>
#include <vector>
#include <unordered_set>
using namespace std;
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
int countNum = 0;
int countTmp = 0;
int maxVal = 0;
unordered_set<int> vset;
for (int i = 0; i < nums.size(); i++) {
vset.insert(nums[i]);
}
/* 去重之后能快200ms */
for (unordered_set<int>::iterator it = vset.begin(); it != vset.end(); it++) {
/* 每次先算x-1是否有值,x-1的哈希没有值的情况才继续 */
if (vset.count((*it) - 1) == 0) {
countNum = 0;
countTmp = *it;
/* x-1的哈希没有值再计算x+1,x+2.... */
while (vset.count(countTmp) != 0) {
countTmp++;
countNum++;
}
if (countNum > maxVal) {
maxVal = countNum;
}
}
}
return maxVal;
}
};
int main() {
vector<int> vec = { 9, 1, 4, 7, 3, -1, 0, 5, 8, -1, 6 };
Solution *ps = new Solution();
cout << ps->longestConsecutive(vec) << endl;
system("pause");
return 0;
}