--- tags: data_structure_python --- # Longest Consecutive Sequence https://leetcode.com/problems/longest-consecutive-sequence/ # Solution 1 - O(n³) - Outer loop: O(n) - `curr_num` gets incremented n times (worse case) - check `curr_num + 1 in nums` is O(n) ```python= class Solution: def longestConsecutive(self, nums: List[int]) -> int: maxCount = 0 for num in nums: curr_num = num count = 1 while curr_num + 1 in nums: curr_num += 1 count += 1 maxCount = max(maxCount, count) return maxCount ``` # Solution 2 - O(logn) time complexity ```python= class Solution: def longestConsecutive(self, nums: List[int]) -> int: if len(nums) == 0: return 0 sorted_nums = sorted(nums) maxCount, count = 0, 1 for i in range(len(sorted_nums)-1): if sorted_nums[i] != sorted_nums[i+1]: if abs(sorted_nums[i] - sorted_nums[i+1]) == 1: count += 1 else: maxCount = max(maxCount, count) count = 1 return max(maxCount, count) ``` # Solution 3 - O(n) time complexity. - Use a set for O(1) lookup - Only compute longest element sequence for the smallest number of the sequence (that's why the complexity is not O(n²) but O(n)) ```python= class Solution: def longestConsecutive(self, nums: List[int]) -> int: maxCount = 0 nums_set = set(nums) for num in nums: if num - 1 in nums_set: # no need for current num to start its own sequence # because it is already part of a longest consecutive # elements sequence continue else: curr_num = num count = 1 while curr_num + 1 in nums_set: curr_num += 1 count += 1 maxCount = max(maxCount, count) return maxCount ```