LeetCode[Map]: 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.

参考: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;
    }

时间性能表现如下:

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值