Leetcode 最长连续序列

题目链接: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 };
View Code

猜你喜欢

转载自www.cnblogs.com/zaq19970105/p/11408556.html