Longest Consecutive Sequence

来源:互联网 发布:淘宝免费申请试用技巧 编辑:程序博客网 时间:2024/05/21 09:02

LeetCode第128题,在一个序列中找最长的连续序列。要求在O(n)复杂度下完成。
排序是可以完成的,但是复杂度最低也是O(nlogn),因此考虑hash。
hash可以先把每个数存起来,然后遍历这些数,往两边扩展寻找连续的数,如果找到了就在hash里删除这个数。
这里删除操作是核心,因为如果一个数在这个连续序列当中,那么以这个数为中心扩展,找到的仍然是这个连续序列,因此完全不需要再以这个数为中心查找。这样就是看上去整个方法复杂度是O(n^2),实际上只有O(n)的原因。
python版本

class Solution(object):    def longestConsecutive(self, nums):        """        :type nums: List[int]        :rtype: int        """        d = {}        res = 0        for num in nums:            d[num] = 1        for i in nums:            length = 1            j = i-1            while d.has_key(j):                del d[j]                 j -= 1                length += 1            k = i+1            while d.has_key(k):                del d[k]                k += 1                length += 1            res = max(res, length)        return res

c++大神版本

class Solution {    public:        int longestConsecutive(const vector<int> &nums) {        unordered_set<int> my_set;        for (auto i : nums) my_set.insert(i);        int longest = 0;        for (auto i : nums) {            int length = 1;            for (int j = i - 1; my_set.find(j) != my_set.end(); --j) {            my_set.erase(j);            ++length;        }        for (int j = i + 1; my_set.find(j) != my_set.end(); ++j) {            my_set.erase(j);            ++length;        }         longest = max(longest, length);        }         return longest;    }};
原创粉丝点击