Longest Consecutive Sequence

来源:互联网 发布:虫虫大作战刷气球软件 编辑:程序博客网 时间:2024/06/03 13:45

如果可以使用排序的话就很容易了,但是这无法满足题目的要求,即在O(n)的时间内完成。

那么只好考虑使用hash的情况,首先将所有元素都插入到hash中。然后考察每一个元素,考察时,判断比他小一号的在不在hash里,直到不在为止;然后判断比他大一号的在不在,直到不在为止。这样就可以得到本元素在内的最长连续序列了。

这里有一个小窍门,每当我找到一个在连续序列里的元素的时候,我就把他从hash中删除。为什么可以这样做?这样做为什么不会影响后面的操作呢?设想一种情况,我把某元素删了,但是我在考察后面的元素的时候,这个元素又应该在包含后面那个元素的连续序列里了。这种情况是不可能发生的,所有的连续序列都是一体的,不存在后面又有元素连续序列又包含前面元素的情况,因为后面这个元素已经在第一次被访问到时(如果他在连续序列里)被删掉了。那么我们就可以放心大胆地直接删掉访问到的元素了。

class Solution {public:    int longestConsecutive(vector<int> &num) {        map<int, int> myHash;        for (int i = 0; i < num.size(); ++i)            myHash[num[i]] = 1;        int maxLen = INT_MIN;        map<int, int>::iterator it;        for (int i = 0; i < num.size(); ++i) {            it = myHash.find(num[i]);            if (it == myHash.end())                continue;            myHash.erase(num[i]);            int asc = 0, dec = 0;            int last = num[i];            while (true) {                it = myHash.find(last - 1);                if (it == myHash.end())                    break;                else {                    myHash.erase(last - 1);                    last -= 1;                    dec++;                }            }            last = num[i];            while (true) {                it = myHash.find(last + 1);                if (it == myHash.end())                    break;                else {                    myHash.erase(last + 1);                    last += 1;                    asc++;                }            }            if (dec + asc + 1 > maxLen)                maxLen = dec + asc + 1;        }        return maxLen;    }};

http://oj.leetcode.com/problems/longest-consecutive-sequence/


0 0
原创粉丝点击