1. 程式人生 > >LeetCode 2.1.6:給定一個未排序的整數陣列,找到最長的連續長度。

LeetCode 2.1.6:給定一個未排序的整數陣列,找到最長的連續長度。

問題描述:給定一個未排序的整數陣列,找到最長的連續長度。

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;
	}
};