Skip to content

Commit 4333e4b

Browse files
committed
solve(w01): 128. Longest Consecutive Sequence
1 parent bd74a52 commit 4333e4b

File tree

1 file changed

+69
-0
lines changed

1 file changed

+69
-0
lines changed
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
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

Comments
 (0)