程序員面試題目總結--數組(26)【最長連續序列】

26、最長連續序列

題目:給定一個任意整數序列,返回序列中最長連續序列的長度。如[100, 4, 200, 1, 3, 2],最長連續序列爲[1,2,3,4],返回長度4。要求時間複雜度爲O(n)

分析:如果允許O(n log n) 的複雜度,那麼可以先排序,可是本題要求O(n)。由於序列裏的元素是無序的,又要求O(n),首先要想到用哈希表。用一個哈希表hash_map<int, bool> used 記錄每個元素是否使用,對每個元素,以該元素爲中心,往左右擴張,直到不連續爲止,記錄下最長的長度。   

#include<iostream>
#include <hash_map>
#include <vector>
using namespace std;
using stdext::hash_map;

int longestConsecutive(const vector<int> &num) 
{
	hash_map<int, bool> used;
	for (int i=0;i<num.size();i++) 
		used[num[i]] = false;
	int longest = 0;
	for (int i=0;i<num.size();i++)
	{
		if (used[num[i]]) continue;
		int length = 1;
		used[num[i]] = true;
		for (int j = num[i] + 1; used.find(j) != used.end(); ++j) 
		{
			used[j] = true;
			++length;
		}
		for (int j = num[i] - 1; used.find(j) != used.end(); --j)
		{
			used[j] = true;
			++length;
		}
		longest = max(longest, length);
	}
	return longest;
}
注:在vs2008中使用hashmap時,出現錯誤:error C2065: “hash_map”: 未聲明的標識符。

這是因爲hash_map目前是vs2008的一個擴展,並沒有在標準的c++中。要想使用hash_map,需要using namespace stdext;但是,這很可能產生命名空間衝突,可以加上:using stdext::hash_map.

發佈了28 篇原創文章 · 獲贊 12 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章