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