標籤:leetcode 演算法 面試
【題目】
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)不一定是one pass, 腦子裡總是有這麼種固定思維,自己給自己挖了個坑。O(kn)也是O(n), 只要k是常數。
要找連續串,又不能排序,那我們要構造一個類列表結構把連續的數串起來。那麼怎麼串呢?很顯然,給定一個數N,那我們需要知道他的前一個數prev和它的後一個數next是否存在,如果存在我們就可以串到prev或者next, 如果不存在則連續串就結束鳥。我們用一個map來表示這種前後繼關係。
prev=N-1; next=N+1; 假定N是存在於數組中的,則map[N]=1
如果prev也在數組中,則map[prev]=1, 否則map[prev]=0
如果next也在數組中,則map[next]=1, 否則map[next]=0
我們對數組進行兩遍掃描:
第一遍掃描是我們產生前後關係map
第二遍掃描利用前後關係恢複連續串,恢複過程中對應數的map[i]都置為0,避免重複恢複
【代碼】
class Solution {public: int longestConsecutive(vector<int> &num) { int size=num.size(); if(size==0)return 0; //第一遍掃描建立前後關係map map<int, int> exist; for(int i=0; i<size; i++){ exist[num[i]]=1; if(exist[num[i]-1]!=1)exist[num[i]-1]=0; if(exist[num[i]+1]!=1)exist[num[i]+1]=0; } //第二遍掃描 int maxLength=0; for(int i=0; i<size; i++){ if(exist[num[i]]==1){ //恢複串 int length=1; int number=num[i]-1; while(exist[number]==1){length++; exist[number]=0; number--;} number=num[i]+1; while(exist[number]==1){length++; exist[number]=0; number++;} if(length>maxLength)maxLength=length; } } return maxLength; }};