力扣 128. 最长连续序列

59 阅读1分钟

🔗 leetcode.cn/problems/lo…

题目

  • 给定无序数组,返回右数组元素组成的最长连续序列的长度

思路

  • 数组排序,判断连续序列的长度,但排序算法时间复杂度至少 n log n
  • 用 hash 记录以当前元素为结尾的,最长连续序列的长度
  • 因为 c++ 中,map 是有序的,可以从最小的元素开始遍历,每次查找 item-1 是否存在,如果存在,更新以当前元素为结尾的最长序列的长度,记录这过程中的最大值

代码

class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        if (nums.empty()) return 0;
        map<int, int> m;
        for (int num : nums) {
            m[num] = 1;
        }
        int ans = 1;
        for (const auto& pair : m) {
            int key = pair.first;
            if (m.find(key-1) != m.end()) {
                int tmp = m[key] = m[key-1] + 1;
                ans = max(ans, tmp);
            }
        }
        return ans;
    }
};