LeetCode题解——Longest Consecutive Sequence

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.

Subscribe to see which companies asked this question

直观想法:排序:O(nlogn) 

创新想法一:从头遍历array, 每遍历一个数i,确定其所在的序列的长度len。建立对应关系imap[i] = len. imap[i]代表数字i所在的序列长度

若i+1,i-1不存在,则iamp[i] = 0;

若i+1, i -1都存在,则imap[i] = imap[i-1] = imap[i+1]=  imap[i-1]  + imap[i+1] +1;

若i+1存在,则iamp[i] = imap[i+1] =  imap[i+1] +1;

若i-1存在,则imap[i] = imap[i-1] = imap[i-1]+1;

class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        int n = nums.size();
        unordered_map<int,int> imap;
        int longestConsecutive = 0;
        for(auto i:nums){
            if(imap[i]) continue;
            longestConsecutive = max(longestConsecutive,imap[i] = imap[i-imap[i-1]] = imap[i+imap[i+1]] = imap[i+imap[i+1]] + imap[i-imap[i-1]] + 1);
        }
        return longestConsecutive;
    }
};

创新想法二:

将原数组放到set里,去除重复数据,遍历set,每取一个数,将set里与之相邻的数都删掉,并计数。

class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        unordered_set<int> s(nums.begin(), nums.end());
        int ans=0;

        while (!s.empty()) {
            int val = *s.begin(), k=val+1, len=1;
            s.erase(val);

            while (s.find(k)!=s.end())
                ++len, s.erase(k++);

            k=val-1;
            while (s.find(k)!=s.end())
                ++len, s.erase(k--);

            ans=max(ans, len);
        }
        return ans;
    }
};


你可能感兴趣的:(LeetCode,hash)