Skip to content

Commit cc48c3a

Browse files
committed
longest consecutive sequence solution(py, ts)
1 parent 6c958b8 commit cc48c3a

File tree

1 file changed

+121
-0
lines changed

1 file changed

+121
-0
lines changed
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
# 처음 풀이
2+
# O(n log n) time, O(n) space
3+
4+
class Solution:
5+
def longestConsecutive(self, nums: List[int]) -> int:
6+
if nums == []:
7+
return 0
8+
9+
nums.sort()
10+
result = []
11+
cnt = 1
12+
13+
for i in range(len(nums)-1):
14+
if nums[i]+1 == nums[i+1]:
15+
cnt += 1
16+
elif nums[i] == nums[i+1]:
17+
continue
18+
else:
19+
result.append(cnt)
20+
cnt = 1
21+
result.append(cnt)
22+
23+
return max(result)
24+
25+
# 공간 복잡도 O(1) 개선 풀이
26+
# result 배열 사용시 최악의 경우 최대 n개의 숫자가 저장되므로 O(n) 공간 사용
27+
# longest 정수 변수 사용시 상수 공간 사용
28+
29+
class Solution:
30+
def longestConsecutive(self, nums: List[int]) -> int:
31+
if not nums: # pythonic code
32+
return 0
33+
34+
nums.sort()
35+
longest = 0
36+
cnt = 1
37+
38+
for i in range(len(nums)-1):
39+
if nums[i]+1 == nums[i+1]:
40+
cnt += 1
41+
elif nums[i] == nums[i+1]:
42+
continue
43+
else:
44+
longest = max(cnt, longest)
45+
cnt = 1
46+
longest = max(cnt, longest)
47+
48+
return longest
49+
50+
# 시간 복잡도 O(n) 개선 풀이
51+
# 현재 문제의 요구사항은 시간 복잡도 O(n)이었으므로, 위에 풀이들은 틀렸음 (You must write an algorithm that runs in O(n) time.)
52+
# O(n) time, O(n) space -> 리트 코드 통과 x
53+
54+
class Solution:
55+
def longestConsecutive(self, nums: List[int]) -> int:
56+
num_set = set(nums)
57+
longest = 0
58+
59+
for num in nums:
60+
if num - 1 in num_set:
61+
continue
62+
cnt = 1
63+
while num + cnt in num_set:
64+
cnt += 1
65+
longest = max(cnt, longest)
66+
67+
return longest
68+
69+
70+
# 최종 개선 풀이
71+
# O(n) time, O(n) space
72+
# 위 풀이에서 한쪽으로 구간을 찾지 않고, 양쪽으로 찾으며 숫자를 집합에서 제거하며
73+
# 집합에서 원소가 하나도 남지 않을 때까지 하면 가장 긴 구간의 길이를 구할 수 있다.
74+
# 배열의 모든 정수를 set에 저장했으므로 공간 복잡도는 O(n)
75+
76+
class Solution:
77+
def longestConsecutive(self, nums: List[int]) -> int:
78+
longest = 0
79+
num_set = set(nums)
80+
81+
while num_set:
82+
num = num_set.pop()
83+
left, right = 1, 1
84+
85+
while num - left in num_set:
86+
num_set.remove(num - left)
87+
left += 1
88+
89+
while num + right in num_set:
90+
num_set.remove(num + right)
91+
right += 1
92+
longest = max(left + right - 1, longest)
93+
94+
return longest
95+
96+
# TS 풀이
97+
# O(n) time, O(n) space
98+
# JavaScript Set에서 값을 꺼내고자 할때는 **numSet.values().next().value** 사용
99+
100+
# function longestConsecutive(nums: number[]): number {
101+
# let numSet = new Set(nums);
102+
# let longest = 0;
103+
104+
# while (numSet.size !== 0) {
105+
# let num = numSet.values().next().value;
106+
# numSet.delete(num);
107+
# let [left, right] = [1, 1];
108+
109+
# while (numSet.has(num - left)) {
110+
# numSet.delete(num - left);
111+
# left += 1;
112+
# }
113+
114+
# while (numSet.has(num + right)) {
115+
# numSet.delete(num + right);
116+
# right += 1;
117+
# }
118+
# longest = Math.max(left + right - 1, longest);
119+
# }
120+
# return longest;
121+
# };

0 commit comments

Comments
 (0)