1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
package main
// 小顶堆
type minHeap struct {
nums []int
k int
}
func createMinHeap(nums []int, k int) *minHeap {
// 初始化
heap := &minHeap{nums: []int{}, k: k}
for i := 0; i < len(nums); i++ {
heap.add(nums[i])
}
return heap
}
// add 添加元素
func (mh *minHeap) add(num int) int {
if mh.k > len(mh.nums) { // 堆中还有位置
mh.nums = append(mh.nums, num) // 添加在堆尾,然后开始上浮
mh.swim(len(mh.nums) - 1) // 上浮
} else { // 堆中没有位置
if num > mh.nums[0] { // num 大于堆顶的数字,即大于堆中的最小值,将最小值替换为num,然后下沉
mh.nums[0] = num
mh.sink(0) // 下沉
}
}
return mh.nums[0]
}
// sink 下沉
func (mh *minHeap) sink(idx int) {
// idx 开始下沉的位置
for 2*idx+1 < len(mh.nums) { // 左子节点不溢出
// 当前节点与左右两个节点中较小的一个交换
child := 2*idx + 1
if child+1 < len(mh.nums) && mh.nums[child] > mh.nums[child+1] {
child++ // 取右子节点
}
if mh.nums[child] >= mh.nums[idx] {
// 子节点大于等于当前值,下沉结束
break
}
// 交换
mh.nums[idx], mh.nums[child] = mh.nums[child], mh.nums[idx]
// 将下标更新为当前交换的子节点
idx = child
}
}
// swim 上浮
func (mh *minHeap) swim(idx int) {
// idx 开始上浮的位置
for idx > 0 { // idx 上浮至0时停止
parent := (idx - 1) >> 1 // 父节点
if mh.nums[parent] <= mh.nums[idx] {
// 父节点小于等于当前值,上浮结束
break
}
// 交换
mh.nums[parent], mh.nums[idx] = mh.nums[idx], mh.nums[parent]
idx = parent
}
}
type KthLargest struct {
heap *minHeap
}
// Constructor 初始化
func Constructor(k int, nums []int) KthLargest {
return KthLargest{heap: createMinHeap(nums, k)}
}
func (this *KthLargest) Add(val int) int {
return this.heap.add(val)
}
func main() {
k := Constructor(3, []int{4, 5, 8, 2})
}
|