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