LeetCode 2.1.6:給定一個未排序的整數陣列,找到最長的連續長度。
阿新 • • 發佈:2018-12-21
問題描述:給定一個未排序的整數陣列,找到最長的連續長度。
Eg:[100, 4, 200, 1, 3, 2], 最長連續長度為4,子陣列為[1,2, 3, 4].
問題分析:我們先定義一個map<int, int>,遍歷一遍陣列,將(key, value)存入map,key是陣列中的每一個數,value是1。接著,我們再遍歷一遍陣列,對於當前遍歷的某個數 k,我們定義一個值 index,index從k開始不停自增1,如果每次自增1後 index 依然可以在map中找到值,就說明陣列中存在k,k+1, k+2...這樣的連續序列;接著,index 從k開始不停自減1,直到map裡找不到這樣的index,這樣就找出了k-1, k-2, ...這樣的連續序列。我們將兩次計算找到的連續序列總長度len儲存下來。
遍歷到下一個數時,依舊這樣做。最後找到len的最大值。
為了避免重複便利,map中已經訪問過的key可以設定為-1,當我們遍歷到陣列中某一個值k時,如果map[k] == -1,說明k已經被計入過某一個連續序列了,因此不用繼續計算。
因此,陣列所有的元素都被訪問兩次,總時間複雜度為O(2n)。
程式碼:
class Solution { public: int longestlen(vector<int> &num) { if(num.size() == 0) { return 0; } map<int,int>m; vector<int>::iterator it1 = num.begin(); vector<int>::iterator it2 = num.end(); for(;it1 != it2;it1++)//把陣列中的元素插入到map中去 value = 1 { if(m.find(*it1) == m.end()) { m.insert(pair<int,int>(*it1,1)); } } int maxlen = 0; int len = 0; for(it1 = num.begin();it1 != it2;it1++)//從頭到尾的遍歷 { if(m[*it1] > 0)//value > 0 { int index = *it1;//index記錄當前值 len = 0; for(;m.find(index) != m.end();++len,m[index++] = -1); //我們定義一個值 index,index開始不停自增1,如果每次自增1後 index 依然可以在map中找到值,就說明陣列中存在k,k+1, k+2...這樣的連續序列 //此時len為一個連續陣列長度 for(index = *it1 - 1;m.find(index) != m.end();++len,m[index--] = -1); //接著,index 開始不停自減1,直到map裡找不到這樣的index,這樣就找出了k-1, k-2, ...這樣的連續序列 if(len > maxlen) { maxlen = len; } } } return maxlen; } };