【LeetCode】128. 最长连续序列
生活随笔
收集整理的這篇文章主要介紹了
【LeetCode】128. 最长连续序列
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、題目描述
給定一個未排序的整數數組,找出最長連續序列的長度。
要求算法的時間復雜度為 O(n)。
二、示例
示例:
輸入: [100, 4, 200, 1, 3, 2] 輸出: 4解釋: 最長連續序列是 [1, 2, 3, 4]。它的長度為 4。
三、分析
參考資料:
- https://www.cnblogs.com/xzxl/p/7226557.html
- https://blog.csdn.net/qq_41593380/article/details/81146850
四、實現
并查集一般包含創建函數,查找函數,合并函數。
本代碼設計很精妙,使用了并查集模塊,在模塊里直接定義了并查集的數組,以及查找函數和合并函數。
class Solution { // 并查集模板(已優化)struct DisJointSet{vector<int> _id; // 元素vector<int> _size; // 集合內的元素個數int max_size; // 最大集合的元素個數【額外需要用到的參數】int _count; // 集合總個數DisJointSet(int Num){for (int i = 0; i < Num; i++){_id.emplace_back(i);_size.emplace_back(1);}_count = Num;max_size = 1;}// 查找int find_(int p){while (p != _id[p]) {p = _id[p];}return p;}// 合并void _union(int p, int q) {int i = find_(p);int j = find_(q);if (i == j)return;if (_size[i] > _size[j]){_id[j] = i;_size[i] += _size[j];max_size = max(max_size, _size[i]);}else{_id[i] = j;_size[j] += _size[i];max_size = max(max_size, _size[j]);}_count--;}}; public:int longestConsecutive(vector<int>& nums) {if (nums.size() == 0)return 0;DisJointSet disJointSet(nums.size());// 記錄是否有查復數字 或者 是否已經有數字的前后的數unordered_set<int> nums_set; // <數字,ID> 與并查集ID一一對應,不需改動模板參數unordered_map<int, int> nums_disJointSetID_map; for (int i = 0; i < nums.size(); i++){if (nums_set.find(nums[i]) != nums_set.end())// 存在重復數字continue; nums_set.insert(nums[i]);nums_disJointSetID_map[nums[i]] = i;// 是否有前一個數if(nums_set.find(nums[i] - 1) != nums_set.end()) {disJointSet._union(nums_disJointSetID_map[nums[i]], nums_disJointSetID_map[nums[i] - 1]);}// 是否有后一個數if(nums_set.find(nums[i] + 1) != nums_set.end()) {disJointSet._union(nums_disJointSetID_map[nums[i]], nums_disJointSetID_map[nums[i] + 1]);}}return disJointSet.max_size;} }; 與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的【LeetCode】128. 最长连续序列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【LeetCode】390.消除游戏
- 下一篇: 【TensorFlow】笔记2:深层神经