Skip to content

Commit 2f3492b

Browse files
committed
add: solution03
1 parent b38e74b commit 2f3492b

File tree

1 file changed

+127
-0
lines changed

1 file changed

+127
-0
lines changed

top-k-frequent-elements/ysle0.go

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
package top_k_frequent_elements
2+
3+
//package main
4+
5+
import (
6+
"container/heap"
7+
"slices"
8+
)
9+
10+
/*
11+
1. 문제
12+
nums 에서 가장 많이 나온 숫자들 k 개를 반환.
13+
14+
2. 풀이
15+
map 에 빈도를 기록하여 내림차순 정렬한 후 k개 뽑기
16+
17+
3. 분석
18+
19+
- 시간 복잡도: O(N + M logM) --> O(N logN)
20+
빈도맵핑을 위한 nums 순회: O(N)
21+
오름차순정렬: O(M logM)
22+
23+
- 공간 복잡도: O(N)
24+
주어진 배열 nums: O(N)
25+
빈도맵핑용 map: O(N)
26+
*/
27+
type Kvp struct {
28+
k int
29+
v int
30+
}
31+
32+
func topKFrequent(nums []int, k int) []int {
33+
freq := map[int]int{}
34+
35+
// 빈도를 기록
36+
for _, n := range nums {
37+
if _, ok := freq[n]; !ok {
38+
freq[n] = 1
39+
} else {
40+
freq[n]++
41+
}
42+
}
43+
44+
// map->array
45+
tmp := make([]Kvp, 0, len(freq))
46+
for key, v := range freq {
47+
tmp = append(tmp, Kvp{key, v})
48+
}
49+
50+
// 내림차순 정렬 (time O(M logM)
51+
slices.SortFunc(tmp, func(a, b Kvp) int { return b.v - a.v })
52+
53+
// []int 로 변환
54+
res := make([]int, 0, len(tmp))
55+
for _, kvp := range tmp {
56+
res = append(res, kvp.k)
57+
}
58+
59+
// k 개 뽑기
60+
return res[:k]
61+
}
62+
63+
func topKElements_HeapBasedApproach(nums []int, k int) []int {
64+
freq := map[int]int{}
65+
for _, n := range nums {
66+
freq[n]++
67+
}
68+
69+
h := &IntHeap{}
70+
heap.Init(h)
71+
72+
for k, v := range freq {
73+
heap.Push(h, Kvp{k, v})
74+
if h.Len() > k {
75+
heap.Pop(h)
76+
}
77+
}
78+
79+
res := make([]int, k)
80+
for i := k - 1; i >= 0; i-- {
81+
res[i] = heap.Pop(h).(Kvp).k
82+
}
83+
84+
return res
85+
}
86+
87+
type IntHeap []Kvp
88+
89+
func (h *IntHeap) Len() int { return len(*h) }
90+
func (h *IntHeap) Less(i, j int) bool { return (*h)[i].v < (*h)[j].v }
91+
func (h *IntHeap) Swap(i, j int) { (*h)[i], (*h)[j] = (*h)[j], (*h)[i] }
92+
func (h *IntHeap) Push(x interface{}) { *h = append(*h, x.(Kvp)) }
93+
func (h *IntHeap) Pop() interface{} {
94+
old := *h
95+
n := len(old)
96+
x := old[n-1]
97+
*h = old[0 : n-1]
98+
return x
99+
}
100+
101+
func topKFrequentElements_BucketSort(nums []int, k int) []int {
102+
freq := map[int]int{}
103+
for _, n := range nums {
104+
freq[n]++
105+
}
106+
107+
buc := make([][]int, len(nums)+1)
108+
for k, v := range freq {
109+
buc[v] = append(buc[v], k)
110+
}
111+
112+
res := []int{}
113+
for i := len(buc) - 1; i >= 0 && len(res) < k; i-- {
114+
res = append(res, buc[i]...)
115+
}
116+
117+
return res[:k]
118+
}
119+
120+
//
121+
//func main() {
122+
// r1 := topKFrequent([]int{1, 1, 1, 2, 2, 3}, 2)
123+
// fmt.Println(r1)
124+
//
125+
// r2 := topKFrequent([]int{1}, 1)
126+
// fmt.Println(r2)
127+
//}

0 commit comments

Comments
 (0)