题目链接:https://leetcode-cn.com/problems/longest-consecutive-sequence/
题目大意:
略。
分析:
注意有重复值,序列为空等情况。
代码如下:
1 class Solution { 2 public: 3 int longestConsecutive(vector<int>& nums) { 4 unordered_map< int, int > m1; // 存以 key 为首的最长连续序列的长度 5 unordered_map< int, int > m2; // 存以 key 为尾的最长连续序列的长度 6 unordered_set< int > vis; // 检查数是否出现过 7 int ans = 0; 8 9 for(int i = 0; i < nums.size(); ++i) { 10 if(vis.find(nums[i]) != vis.end()) continue; 11 vis.insert(nums[i]); 12 13 m1[nums[i]] = m2[nums[i]] = 1; 14 15 if(m2.find(nums[i] - 1) != m2.end()) { // 查一下是否存在以nums[i] - 1结尾的序列 16 splice(nums[i] - 1, nums[i], m2, m1); // 拼接 17 } 18 if(m1.find(nums[i] + 1) != m1.end()) { // 查一下是否存在以nums[i] + 1开头的序列 19 splice(nums[i], nums[i] + 1, m2, m1); // 拼接 20 } 21 } 22 23 for(auto &x : m1) ans = max(ans, x.second); 24 25 return ans; 26 } 27 28 // 拼接以B结尾的序列和以A开头的序列 29 inline void splice(int B, int A, unordered_map< int, int > &mB, unordered_map< int, int > &mA) { 30 mB[A + mA[A] - 1] = mA[B - mB[B] + 1] = mB[B] + mA[A]; 31 mA.erase(A); 32 mB.erase(B); 33 } 34 };