題目: 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. 題意在線性的時間內找到集合中元素組成的最長的連續序列。 規定只能線性的復雜度,顯然不能排序了,就想到用哈希去標記處理。 先遍歷一邊把所有的元素存起來,然後重頭遍歷,每遇到一個沒處理過的元素, 用兩個指針分別向兩個方向尋找連續的元素,記錄長度,並把元素標記成處理過,防止重復處理。 開始用靜態數組標記,發現數據范圍爆了,改成map去存就過了。 嚴格上應該寫成哈希表的形式,map存儲的復雜度大於O(n),但時間沒卡那麼緊,意思明白就行懶得改了。
class Solution {
public:
int longestConsecutive(vector<int> &num) {
map<int,bool>m;
int i,j,k,len=num.size(),maxx=0;
for(i=0;i<len;++i)m[num[i]]=true;
for(i=0;i<len;++i)
{
if(m[num[i]]==true)
{
m[num[i]]=0;
int n=1;
int left=num[i]-1,right=num[i]+1;
while(m[left]==true)
{
m[left--]=0;
n++;
}
while(m[right]==true)
{
m[right++]=0;
n++;
}
maxx=max(maxx,n);
}
}
return maxx;
}