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