码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode[Map]: Longest Consecutive Sequence

时间:2015-03-02 14:57:06      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:leetcode   map   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.

参考:https://oj.leetcode.com/discuss/18886/my-really-simple-java-o-n-solution-accepted

思路如下:用一个map存储所有连续序列的长度,并保存在以序列头尾元素对应的value中。举例来说,对于序列{1,2,3,4,5},map[1]和map[5]应该都等于5。

过程:遍历整个输入数组,对于每一个新元素n:
1. 当前元素如果已经存在在map中,那么直接跳过该元素。
2. 如果n-1和n+1存在在map中,那么说明邻近n有已经存在的序列。变量left和right分别存储两边序列的长度,而0则表示没有已经存在的序列,那么n将是序列的边界。
3. 利用left和right来定位左侧和右侧边界,更新边界和当前n的value均为sum = left + 1 + right。

C++代码实现如下:

    int longestConsecutive(vector<int> &num) {
        unordered_map<int, int> myMap;
        int res = 0;
        for (auto n : num) {
            if (myMap.find(n) == myMap.end()) {
                int left  = myMap.find(n - 1) == myMap.end() ? 0 : myMap[n - 1];
                int right = myMap.find(n + 1) == myMap.end() ? 0 : myMap[n + 1];

                int sum = left + 1 + right;
                if (sum > res) res = sum;
                myMap[n] = myMap[n - left ] = myMap[n + right] = sum;
            }
        }

        return res;
    }

时间性能表现如下:

技术分享

LeetCode[Map]: Longest Consecutive Sequence

标签:leetcode   map   sequence   连续   算法   

原文地址:http://blog.csdn.net/chfe007/article/details/44016941

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!