日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【LeetCode】128. 最长连续序列

發布時間:2025/3/19 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【LeetCode】128. 最长连续序列 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、題目描述

給定一個未排序的整數數組,找出最長連續序列的長度。

要求算法的時間復雜度為 O(n)。

二、示例

示例:

輸入: [100, 4, 200, 1, 3, 2] 輸出: 4

解釋: 最長連續序列是 [1, 2, 3, 4]。它的長度為 4。

三、分析

  • 思路一:使用sort排序,然后查找最大的連續序列。因為題目要求時間復雜度為 O(N) ,這種方式不可用。
  • 使用并查集
    參考資料:
    • 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. 最长连续序列的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。