File tree Expand file tree Collapse file tree 1 file changed +72
-0
lines changed
longest-consecutive-sequence Expand file tree Collapse file tree 1 file changed +72
-0
lines changed Original file line number Diff line number Diff line change
1
+ package longest_consecutive_sequence
2
+
3
+ import "slices"
4
+
5
+ /*
6
+ 1. 문제
7
+ 주어진 int 배열 nums에서 찾을 수 있는 가장 긴 연속된 원소의 길이 구하기
8
+
9
+ 2. 풀이
10
+ 모든 수의 중복을 제거하고, 오름차순으로 정렬하여 연속된 원소의 부분을 찾기 위해서
11
+ 배열을 순회하여 인덱스 고정~전진하며 다음 원소가 연속된 원소인지 체크를 반복
12
+
13
+ 3. 분석
14
+
15
+ - 시간 복잡도: O(N logN)
16
+ 배열 정렬 O(N logN)
17
+ 중복된 원소를 제거해주는 slices.Compact(nums): O(N)
18
+ 2중 포문은 for 문 순회 index 를 같이 쓰므로 O(N)
19
+
20
+ - 공간 복잡도: O(N)
21
+ */
22
+ func longestConsecutive (nums []int ) int {
23
+ if len (nums ) == 0 {
24
+ return 0
25
+ }
26
+
27
+ if len (nums ) == 1 {
28
+ return 1
29
+ }
30
+
31
+ slices .Sort (nums )
32
+ nums = slices .Compact (nums )
33
+ // 중복을 제거하고 나서도 1개면 최장연속수는 1
34
+ if len (nums ) == 1 {
35
+ return 1
36
+ }
37
+
38
+ cons := map [int ]int {}
39
+ cursor := 0
40
+ for cursor < len (nums )- 1 {
41
+ cons [cursor ] = 1
42
+ wasConsecutive := false
43
+
44
+ // cursor 는 고정하고, innerCursor 를 돌림
45
+ innerCursor := cursor
46
+ for innerCursor + 1 < len (nums ) &&
47
+ nums [innerCursor ]+ 1 == nums [innerCursor + 1 ] {
48
+
49
+ cons [cursor ]++
50
+ innerCursor ++
51
+ wasConsecutive = true
52
+ }
53
+
54
+ if wasConsecutive {
55
+ cursor = innerCursor
56
+ }
57
+ cursor ++
58
+ }
59
+
60
+ //tmp := make([]int, 0, len(cons))
61
+ tmp := make ([]int , 0 , len (cons ))
62
+ for _ , v := range cons {
63
+ tmp = append (tmp , v )
64
+ }
65
+
66
+ slices .SortFunc (
67
+ tmp ,
68
+ func (a , b int ) int {
69
+ return b - a
70
+ })
71
+ return tmp [0 ]
72
+ }
You can’t perform that action at this time.
0 commit comments