leetcode 刷题之路 6 Longest Consecutive Sequence

来源:互联网 发布:淘宝商学院培训多少钱 编辑:程序博客网 时间:2024/05/22 11:32

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(1)复杂度的查询操作,使用散列表来完成数据的存储和查询操作通过合理的程序设计可以解决这个问题。实际采用C++的unordered_set容器,该容器基于散列表机制(普通的set是基于红黑树的,查询,插入,删除复杂度都为o(logn)),在O(1)时间复杂度的开销下可以完成查询,插入,删除操作。具体的实施步骤是这样子,首先遍历数组,将每个数字都添加到unordered_set容器si中,然后取si中一个数字N,查询N+1,N+2...,N-1,N-2...等相邻元素是否在其中,记录相邻元素的个数到count中,同时从si中删除掉这一组相邻元素,重复上面的操作,直到si变为空,记录出现过得最大的count值,这个值即为所求。

my accepted answer in C++:

class Solution {public:    int longestConsecutive(vector<int> &num)     {        unordered_set<int> si;for (vector<int>::iterator iter = num.begin(); iter != num.end(); iter++)si.insert(*iter);int max=0;int count = 1;int i = 1;unordered_set<int>::iterator siIter;while (!si.empty()){int current = *si.begin();si.erase(si.begin());while ((siIter=si.find(current + i))!= si.end()){i++;count++;si.erase(siIter);}            i=1;while ((siIter = si.find(current-i)) != si.end()){i++;count++;si.erase(siIter);}if (max < count)max = count;i = 1;count = 1;}return max;        }};


0 0
原创粉丝点击