LeetCode 128. 最长连续序列(Longest Consecutive Sequence)
题目描述
给定一个未排序的整数数组,找出最长连续序列的长度。
要求算法的时间复杂度为 O(n)。
示例:
输入: [100, 4, 200, 1, 3, 2]
输出: 4
解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。
解题思路
利用并查集的思想,构造一个map记录数组中以每个数所在的最长连续序列长度。每次遍历到一个数时,首先检查map中是否存在该数,若存在直接跳过,否则作如下更新操作:
找到左右相邻数字是否在map中,若存在则分别记录他们所在的最长连续序列长度,并更新当前的最长连续序列长度,然后把长度更新到新序列左右端点和此数对应的map中。
代码
1 class Solution { 2 public: 3 int longestConsecutive(vector<int>& nums) { 4 map<int, int> m; 5 int maxLen = 0; 6 for(int num: nums){ 7 if(m.count(num)) continue; 8 int left = m.count(num - 1) ? m[num - 1] : 0; 9 int right = m.count(num + 1) ? m[num + 1] : 0; 10 int len = left + right + 1; 11 maxLen = max(maxLen, len); 12 m[num - left] = len; 13 m[num + right] = len; 14 m[num] = len; 15 } 16 return maxLen; 17 } 18 };