Back to Leetcode Go

347. Top K Frequent Elements

website/content/ChapterFour/0300~0399/0347.Top-K-Frequent-Elements.md

1.7.12.2 KB
Original Source

347. Top K Frequent Elements

题目

Given a non-empty array of integers, return the k most frequent elements.

Example 1:


Input: nums = [1,1,1,2,2,3], k = 2
Output: [1,2]

Example 2:


Input: nums = [1], k = 1
Output: [1]

Note:

  • You may assume k is always valid, 1 ≤ k ≤ number of unique elements.
  • Your algorithm's time complexity must be better than O(n log n), where n is the array's size.

题目大意

给一个非空的数组,输出前 K 个频率最高的元素。

解题思路

这一题是考察优先队列的题目。把数组构造成一个优先队列,输出前 K 个即可。

代码

go

package leetcode

import "container/heap"

func topKFrequent(nums []int, k int) []int {
	m := make(map[int]int)
	for _, n := range nums {
		m[n]++
	}
	q := PriorityQueue{}
	for key, count := range m {
		heap.Push(&q, &Item{key: key, count: count})
	}
	var result []int
	for len(result) < k {
		item := heap.Pop(&q).(*Item)
		result = append(result, item.key)
	}
	return result
}

// Item define
type Item struct {
	key   int
	count int
}

// A PriorityQueue implements heap.Interface and holds Items.
type PriorityQueue []*Item

func (pq PriorityQueue) Len() int {
	return len(pq)
}

func (pq PriorityQueue) Less(i, j int) bool {
	// 注意:因为 golang 中的 heap 默认是按最小堆组织的,所以 count 越大,Less() 越小,越靠近堆顶。这里采用 >,变为最大堆
	return pq[i].count > pq[j].count
}

func (pq PriorityQueue) Swap(i, j int) {
	pq[i], pq[j] = pq[j], pq[i]
}

// Push define
func (pq *PriorityQueue) Push(x interface{}) {
	item := x.(*Item)
	*pq = append(*pq, item)
}

// Pop define
func (pq *PriorityQueue) Pop() interface{} {
	n := len(*pq)
	item := (*pq)[n-1]
	*pq = (*pq)[:n-1]
	return item
}


<div style="display: flex;justify-content: space-between;align-items: center;"> <p><a href="https://books.halfrost.com/leetcode/ChapterFour/0300~0399/0345.Reverse-Vowels-of-a-String/">⬅️上一页</a></p> <p><a href="https://books.halfrost.com/leetcode/ChapterFour/0300~0399/0349.Intersection-of-Two-Arrays/">下一页➡️</a></p> </div>