Skip to content

Commit df80b67

Browse files
author
이연수
committed
Longest Consecutive Sequence
1 parent 192d7d5 commit df80b67

File tree

1 file changed

+57
-0
lines changed

1 file changed

+57
-0
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package leetcode_study
2+
3+
/**
4+
* HashSet을 사용한 풀이.
5+
* 시간 복잡도 O(n)
6+
* -> Loop를 두 번 돌기 때문에 O(n^2)이라고 생각할 수 있으나 최악의 상황이여도 O(n + (n-1))로 O(n)이 됨.
7+
* -> 1 부터 10억까지의 연속된 수가 Set 자료구조에 담겨 있고 최악의 상황으로 1이 마지막 순번에 뽑힌다고 가정했을 때, (Set은 순서가 존재하지 않음)
8+
* -> 1 부터 Longest Count 하더라도 주어진 nums에서 n 번 set에서 10억 -1번을 순회하므로 O(n^2)이 아닌 O(n)이 됨.
9+
*/
10+
fun longestConsecutive(nums: IntArray): Int {
11+
val numSet: HashSet<Int> = nums.toHashSet()
12+
var longest = 0
13+
14+
for (num in nums) {
15+
// 현재 요소보다 크기가 1 작은 숫자를 갖고 있다면 현재 요소는 최소값이 아니므로 다음으로 넘어감
16+
if (numSet.contains(num -1)) {
17+
continue
18+
}
19+
// 현재 요소보다 1 작은 연속된 숫자가 없으므로 현재 원소를 1 카운트 한 length 할당
20+
var length = 1
21+
while (numSet.contains(num + length)) {
22+
length++
23+
}
24+
longest = max(longest, length)
25+
}
26+
return longest
27+
}
28+
29+
/**
30+
* Time Limit 발생.
31+
* 시간 복잡도 O(n^2)
32+
* -> nums 안에 존재하는 요소마다 중복을 포함한 Loop(while) 진행
33+
*/
34+
fun longestConsecutive01(nums: IntArray): Int {
35+
// 결과를 담을 리스트
36+
val resultList = mutableListOf<Int>()
37+
38+
// 1차 loop
39+
for (i in nums.indices) {
40+
var tempResult = 0
41+
var currentNum = nums[i]
42+
// 2차 loop
43+
while (true) {
44+
if (nums.contains(currentNum)) {
45+
tempResult += 1
46+
currentNum += 1
47+
} else {
48+
break
49+
}
50+
}
51+
resultList.add(tempResult)
52+
}
53+
if (resultList.isEmpty()) {
54+
return 0
55+
}
56+
return resultList.max()
57+
}

0 commit comments

Comments
 (0)