Go 简单版本:
package main
import (
"container/heap"
"fmt"
)
type IntSlice []int
func (s *IntSlice) Len() int {
return len(*s)
}
func (s *IntSlice) Less(i, j int) bool {
return (*s)[i] < (*s)[j]
}
func (s *IntSlice) Swap(i, j int) {
(*s)[i], (*s)[j] = (*s)[j], (*s)[i]
}
func (s *IntSlice) Push(x interface{}) {
*s = append(*s, x.(int))
}
func (s *IntSlice) Pop() interface{} {
length := s.Len()
last := (*s)[length-1]
*s = (*s)[:length-1]
return last
}
type KthLargest struct {
minHeap IntSlice
kth int
}
func Constructor(k int, nums []int) KthLargest {
kthLargest := KthLargest{
minHeap: make(IntSlice, 0),
kth: k,
}
for _, v := range nums {
kthLargest.Add(v)
}
return kthLargest
}
func (k *KthLargest) Add(val int) int {
if k.minHeap.Len() < k.kth { // 如果还没有满, 无论如何插入元素
heap.Push(&k.minHeap, val)
} else {
if val > k.minHeap[0] { // 判断插入元素 大于 当前元素里面的最小值, 则插入
heap.Pop(&k.minHeap)
heap.Push(&k.minHeap, val)
}
}
return k.minHeap[0]
}
func main() {
kthLargest := Constructor(3, []int{
4, 5, 8, 2,
})
fmt.Println(kthLargest.Add(3))
fmt.Println(kthLargest.Add(5))
fmt.Println(kthLargest.Add(10))
fmt.Println(kthLargest.Add(9))
fmt.Println(kthLargest.Add(4))
}
展开