347.M 前 K 个高频元素
思路
Code
func topKFrequent(nums []int, k int) []int {
countMap := make(map[int]int)
for _, num := range nums {
countMap[num]++
}
var uniqNums []int
for num := range countMap {
uniqNums = append(uniqNums, num)
}
for i := len(uniqNums)/2 - 1; i >= 0; i-- {
maxHeapify(uniqNums, countMap, i, len(uniqNums))
}
var ans []int
for i := 0; i < k; i++ {
ans = append(ans, uniqNums[0])
uniqNums[0], uniqNums[len(uniqNums)-i-1] = uniqNums[len(uniqNums)-i-1], uniqNums[0]
maxHeapify(uniqNums, countMap, 0, len(uniqNums)-i-1)
}
return ans
}
func maxHeapify(nums []int, countMap map[int]int, root int, heapSize int) {
l, r, largest := 2*root+1, 2*root+2, root
if l < heapSize && countMap[nums[l]] > countMap[nums[largest]] {
largest = l
}
if r < heapSize && countMap[nums[r]] > countMap[nums[largest]] {
largest = r
}
if largest != root {
nums[largest], nums[root] = nums[root], nums[largest]
maxHeapify(nums, countMap, largest, heapSize)
}
}Last updated