# **Leetcode筆記(Longest Consecutive Sequence)** :::info :information_source: 題目 : Longest Consecutive Sequence, 類型 : array , 等級 : medium 日期 : 2023/04/16,2023/06/27,2023/12/07,2024/04/07 ::: ### 嘗試 ```python class Solution: def longestConsecutive(self, nums: List[int]) -> int: record = set() for i in range(len(nums)): record.add(nums[i]) longest = 0 for num in nums: if (num - 1) not in record: length = 1 # 開始計算長度 # 在集合中查找(num + length),直到(num + length)不在集合中為止 # 時間複雜度取決於最長序列的長度k,因此操作次數為O(k) while (num + length) in record: length += 1 longest = max(length, longest) continue return longest ``` 2023/05/07 ```python # 忘記解法 直接看 # 簡單來說就是把某個數字後檢查一下 # 看有多後面的數存在於list中 class Solution: def longestConsecutive(self, nums: List[int]) -> int: record = set(nums) max_length = 0 for n in nums: if (n - 1) not in record: length = 1 n_add = 1 while (n + n_add) in record: length += 1 n_add += 1 max_length = max(max_length, length) return max_length ``` 2023/06/27 (n - 1) not in record的時間複雜度是O(1)。因為在Python的集合中,通過哈希表實現了高效的查找操作 總時間複雜度為O(n) ```python class Solution: def longestConsecutive(self, nums: List[int]) -> int: record = set(nums) # 把list轉成set執行比較快 maxLen = 0 for n in record: if (n - 1) not in record: # 這句的時間複雜度為O(1) length = 1 add = 1 while (n + add) in record: length += 1 add += 1 maxLen = max(maxLen, length) return maxLen ``` 2023/12/07 ```python """ nums = [100,4,200,1,3,2] add n into set for while 1 l += 1 """ class Solution: def longestConsecutive(self, nums: List[int]) -> int: record = set() for n in nums: record.add(n) maxLength = 0 for n in nums: # n - 1 的話 就代表後續會有人去處理現在這個n if n - 1 in record: continue length = 1 while (n + 1) in record: n += 1 length += 1 maxLength = max(maxLength, length) return maxLength ``` 2024/04/07 記得res要重新計算,需要有一個全域變數,因為可能有多種答案 ```python class Solution: def longestConsecutive(self, nums: List[int]) -> int: record = set(nums) maxRes = 0 for n in nums: if n + 1 in record: continue res = 1 while n - 1 in record: res += 1 n -= 1 maxRes = max(maxRes, res) return maxRes ``` --- ### **優化** 第二個for循環對於每個元素進行以下操作: * 檢查(num - 1)是否在集合中,時間複雜度為O(1)。 * 如果(num - 1)不在集合中,開始計算最長序列的長度。在集合中查找(num + length),直到(num + length)不在集合中為止。時間複雜度取決於最長序列的長度k,因此操作次數為O(k)。 * 更新最長序列的長度,時間複雜度為O(1)。 因此,第二個for循環的總操作次數為O(nk)。 ```python class Solution: def longestConsecutive(self, nums: List[int]) -> int: record = set(nums) longest = 0 for num in nums: if (num - 1) not in record: length = 1 # 開始計算長度 # 在集合中查找(num + length),直到(num + length)不在集合中為止 # 時間複雜度取決於最長序列的長度k,因此操作次數為O(k) while (num + length) in record: length += 1 longest = max(length, longest) continue return longest ``` --- **:warning: 錯誤語法** :::warning ::: **:thumbsup:學習** :::success 把nums放進set中,可以簡化成record = set(nums) ::: **思路** **講解連結** https://www.youtube.com/watch?v=P6RZZMu_maU&ab_channel=NeetCode Provided by. NeetCode ###### tags: `arrays` `medium` `leetcode`