描述
输入一个乱序的连续数列,输出其中最长连续数列长度,要求算法复杂度为 O(n) 。
输入
54,55,300,12,56
输出
3
通常我们看有没有连续序列时 找某个数有没有的前后的数,比如看到55,我们会下意识找56,57...54,53...这道题做法也是这样。
我的做法是用map映射,键为列表中的每个数,值为1。然后遍历数组,比如数为55,找这个数的前后有没有map映射后值为1的,有的话sum++,为了防止重复遍历需要把遍历过的数的映射值改成-1。
class Solution { public: int longestConsecutive(vector<int>& nums) { map<int, int>M; int len = nums.size(), ans = 0; for(int i = 0; i < len; i++) M[nums[i]] = 1; for(int i = 0; i < len; i++) { if(M[nums[i]] == -1) continue; int sum = 1, j = nums[i]; while(1) { M[j] = -1; if(M[++j] == 1) { sum++; continue; } break; } j = nums[i]; while(1) { M[j] = -1; if(M[--j] == 1) { sum ++; continue; } break; } ans = max(ans, sum); } return ans; } };