LeetCode: Longest Consecutive Sequence [128]
【題目】
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;//第一遍掃描建立前后關系mapmap<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;} };總結
以上是生活随笔為你收集整理的LeetCode: Longest Consecutive Sequence [128]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU1011 Starship Tro
- 下一篇: Android开发之 当前日期Strin