题目
最长连续序列
给定一个未排序的整数数组,找出最长连续序列的长度。
要求算法的时间复杂度为 O(n)。
示例:
输入: [100, 4, 200, 1, 3, 2]
输出: 4
解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。
我的思路
1、快速排序,遍历数组,使用计数器进行计数。
注意:数组中的重复数字
2、参考博客Grandyang,使用set。
代码
//
// Created by HINTS on 2018/12/20.
//
#include <iostream>
#include <vector>
#include <c++/algorithm>
#include <unordered_set>
using namespace std;
/*
//第一种解法:使用STL
int findKthLargest1(vector<int>& nums, int k) {
sort(nums.begin(), nums.end());
return nums[nums.size() - k];
}
//第二种解法:自己实现快速排序
//返回p, 使得nums[l...p-1] < nums[p] ; nums[p+1...r] > nums[p]
int __partition(vector<int> &nums, int l , int r){
int v = nums[l];
int j = l;
for (int i = l + 1; i <= r; ++i) {
if(nums[i] < v){
j++;
swap(nums[j], nums[i]);
}
}
swap(nums[l], nums[j]);
return j;
}
void __quickSort(vector<int> &nums, int l, int r){
if(l >= r)
return ;
int p = __partition(nums, l, r);
__quickSort(nums, l, p-1);
__quickSort(nums, p+1, r);
}
void quickSort(vector<int> &nums, int n){
__quickSort(nums,0 , n-1);
}
int longestConsecutive(vector<int> &nums){
if(nums.empty())
return 0;
quickSort(nums, nums.size());
int maxLength = 0;
int count = 1;
for (int i = 0; i < nums.size() - 1; ++i) {
if(nums[i+1] == nums[i])
continue;
if(nums[i + 1] - nums[i] == 1){
count++;
maxLength = max(maxLength, count);
}else{
count = 1;
}
}
return max(maxLength, count);
}
*/
int longestConsecutive(vector<int> &nums){
int res = 0;
unordered_set<int>s (nums.begin(), nums.end());
for(int val : nums){
if(!s.count(val))
continue;
s.erase(val);
int pre = val - 1, next = val + 1;
while (s.count(pre))
s.erase(pre--);
while (s.count(next))
s.erase(next++);
res = max(res,next - pre - 1);
}
return res;
}
int main(){
vector<int> nums = {100, 4, 200, 1, 3, 2};
int res = longestConsecutive(nums);
cout << res << endl;
return 0;
}