|
| 1 | +# https://leetcode.com/problems/longest-consecutive-sequence/ |
| 2 | + |
| 3 | +from typing import List |
| 4 | + |
| 5 | +class Solution: |
| 6 | + def longestConsecutive1(self, nums: List[int]) -> int: |
| 7 | + """ |
| 8 | + [Complexity] |
| 9 | + - TC: O(n) |
| 10 | + - SC: O(n) (unique_nums) |
| 11 | +
|
| 12 | + [Approach] |
| 13 | + O(n) time에 돌아가야 하므로 O(nlogn)인 sorting은 사용할 수 없다. |
| 14 | + 그리고 integer에서 consecutive 라는 것은 1 차이라는 것이다. |
| 15 | + 따라서 hash map에서 현재 보고 있는 num 값에 대해 left(= num - 1)와 right(= num + 1)를 O(1) time에 찾아보는 방식으로 접근해야 한다. |
| 16 | + 이때, left와 right를 양옆으로 확장시켜가면서 max_length = max(max_length, right - left - 1)로 업데이트 한다. |
| 17 | + """ |
| 18 | + |
| 19 | + max_length = 0 |
| 20 | + unique_nums = set(nums) |
| 21 | + |
| 22 | + for num in nums: |
| 23 | + # num의 consecutive integer인 left, right 구하기 |
| 24 | + left, right = num - 1, num + 1 |
| 25 | + |
| 26 | + # left, right 양옆으로 확장하며 unique_nums에서 지워나가기 |
| 27 | + while left in unique_nums: |
| 28 | + unique_nums.remove(left) |
| 29 | + left -= 1 |
| 30 | + while right in unique_nums: |
| 31 | + unique_nums.remove(right) |
| 32 | + right += 1 |
| 33 | + |
| 34 | + # 현재 보고 있는 num이 속하는 consecutive sequence의 length는 (right - left - 1) |
| 35 | + max_length = max(max_length, right - left - 1) |
| 36 | + |
| 37 | + # unique_nums가 비었으면, 더이상 확인할 필요가 없음 |
| 38 | + if not unique_nums: |
| 39 | + break |
| 40 | + |
| 41 | + return max_length |
| 42 | + |
| 43 | + def longestConsecutive(self, nums: List[int]) -> int: |
| 44 | + """ |
| 45 | + [Complexity] |
| 46 | + - TC: O(n) |
| 47 | + - SC: O(n) (unique_nums) |
| 48 | +
|
| 49 | + [Approach] |
| 50 | + 첫 번째 풀이와 비슷하나, unique_nums를 순회하다가 현재 보고 있는 num이 자신이 속한 consecutive sequence의 가장 left 값일 때만 |
| 51 | + 오른쪽으로 확장한다는 점에서 약간 다른 풀이이다. |
| 52 | + 이때, 오른쪽으로 확장 후 max_length = max(max_length, right - num)로 업데이트 한다. |
| 53 | + """ |
| 54 | + |
| 55 | + max_length = 0 |
| 56 | + unique_nums = set(nums) |
| 57 | + |
| 58 | + for num in unique_nums: |
| 59 | + # 현재 보고 있는 num이, 자신이 속한 consecutive sequence의 가장 left 값이라면, |
| 60 | + if num - 1 not in unique_nums: |
| 61 | + # 오른쪽으로 확장하기 |
| 62 | + right = num + 1 |
| 63 | + while right in unique_nums: |
| 64 | + right += 1 |
| 65 | + |
| 66 | + # 현재 보고 있는 num이 첫 번째 값인 consecutive sequence의 length는 (right - num) |
| 67 | + max_length = max(max_length, right - num) |
| 68 | + |
| 69 | + return max_length |
0 commit comments