No.128 LeetCode題目 “最長連續序列”

題目描述

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

要求算法的時間複雜度爲 O(n)

示例:

輸入: [100, 4, 200, 1, 3, 2]
輸出: 4
解釋: 最長連續序列是 [1, 2, 3, 4]。它的長度爲 4。

解題思路

本題要求時間爲O(n),即掃描一遍就需要得出結果。
可以採用哈希表的原理,採用unorded_set即可,按照以下步驟計算:

  1. nums中的數據放入set中;
  2. 對於nums中的每個數nums[i],若nums[i]-1已經在set中,則繼續掃描下一個數;
  3. nums[i]-1不在set中,則查找nums[i]+1,直到找不到爲止,最終返回最大的max_length

比較巧妙的地方就是查找nums[i]-1,如果存在的話就按照nums[i]-1的結果返回max_length即可,減少了時間複雜度。

具體實現過程可參考代碼及註釋。

完整代碼

class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
      //定義一個集合,用於查重
      unordered_set<int>set;
      //將nums中的數據出入到set中
      for(int i = 0;i<nums.size();i++){
        set.insert(nums[i]);
      }

      //對於nums中的每個數nums[i],若nums[i]-1已經在set中,則繼續掃描下一個數
      //若nums[i]-1不在set中,則查找nums[i]+1,直到找不到爲止,最終返回最大的length
      int max_length = 0;
      for(int i = 0;i<nums.size();i++){
        //先找nums[i]-1
        if(set.count(nums[i]-1) == 0){
          int current_length = 1;
          int current_number = nums[i] + 1;
          //再找nums[i] + 1
          while(set.count(current_number) == 1){
            current_length += 1;
            current_number += 1;
          }
          max_length = max(max_length, current_length);
        }
      }
      return max_length;
    }
};

性能結果

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章