17. Longest Consecutive Sequence

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容