美文网首页
17. Longest Consecutive Sequence

17. Longest Consecutive Sequence

作者: 邓博文_7c0a | 来源:发表于2018-01-25 08:10 被阅读0次

    Link to the problem

    Description

    Given an unsorted array of integers, find the length of the longest consecutive elements sequence.

    Your algorithm should run in O(n) complexity.

    Example

    Given [100, 4, 200, 1, 3, 2],
    The longest consecutive elements sequence is [1, 2, 3, 4]. Return its length: 4.

    Given the following 3x6 height map:
    [
    [1,4,3,1,3,2],
    [3,2,1,3,2,4],
    [2,3,3,2,3,1]
    ]

    Return 4.

    Idea

    Maintain a dictionary left/right with number as key, and maximum segment length on its left/right as the value. Each time a new element is inserted, we can maintain the corresponding values for endpoints only.

    Solution

    class Solution {
    public:
        int longestConsecutive(vector<int> &nums) {
            unordered_map<int, int> left, right;
            for (auto it = nums.begin(); it != nums.end(); it++) {
                if (left.find(*it) != left.end()) continue;
                bool has_left = (left.find(*it - 1) != left.end());
                bool has_right = (right.find(*it + 1) != right.end());
                if (!has_left && !has_right) {
                    left[*it] = 1;
                    right[*it] = 1;
                } else if (!has_left && has_right) {
                    left[*it] = 1;
                    int tot = 1 + right[*it + 1];
                    right[*it] = tot;
                    left[*it + right[*it + 1]] = tot;
                } else if (has_left && !has_right) {
                    right[*it] = 1;
                    int tot = 1 + left[*it - 1];
                    left[*it] = tot;
                    right[*it - left[*it - 1]] = tot;
                } else {
                    left[*it] = 1 + left[*it - 1];
                    right[*it] = 1 + right[*it + 1];
                    int tot = 1 + left[*it - 1] + right[*it + 1];
                    left[*it + right[*it + 1]] = tot;
                    right[*it - left[*it - 1]] = tot;
                }
            }
            int rtn = 0;
            for (auto it = left.begin(); it != left.end(); it++) {
                rtn = max(rtn, it->second);
            }
            return rtn;
        }
    };
    

    68 / 68 test cases passed.
    Runtime: 13 ms

    相关文章

      网友评论

          本文标题:17. Longest Consecutive Sequence

          本文链接:https://www.haomeiwen.com/subject/fpumaxtx.html