26、最長連續序列
題目:給定一個任意整數序列,返回序列中最長連續序列的長度。如[100, 4, 200, 1, 3, 2],最長連續序列爲[1,2,3,4],返回長度4。要求時間複雜度爲O(n)
分析:如果允許O(n log n) 的複雜度,那麼可以先排序,可是本題要求O(n)。由於序列裏的元素是無序的,又要求O(n),首先要想到用哈希表。用一個哈希表hash_map<int, bool> used 記錄每個元素是否使用,對每個元素,以該元素爲中心,往左右擴張,直到不連續爲止,記錄下最長的長度。
#include<iostream>
#include <hash_map>
#include <vector>
using namespace std;
using stdext::hash_map;
int longestConsecutive(const vector<int> &num)
{
hash_map<int, bool> used;
for (int i=0;i<num.size();i++)
used[num[i]] = false;
int longest = 0;
for (int i=0;i<num.size();i++)
{
if (used[num[i]]) continue;
int length = 1;
used[num[i]] = true;
for (int j = num[i] + 1; used.find(j) != used.end(); ++j)
{
used[j] = true;
++length;
}
for (int j = num[i] - 1; used.find(j) != used.end(); --j)
{
used[j] = true;
++length;
}
longest = max(longest, length);
}
return longest;
}
注:在vs2008中使用hashmap時,出現錯誤:error
C2065: “hash_map”: 未聲明的標識符。
這是因爲hash_map目前是vs2008的一個擴展,並沒有在標準的c++中。要想使用hash_map,需要using namespace stdext;但是,這很可能產生命名空間衝突,可以加上:using stdext::hash_map.