347. 前 K 个高频元素
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
桶排序
设置若干个桶,每个桶存储出现频率相同的数。桶的下标表示数出现的频率,即第 i 个桶中存储的数出现的频率为 i
把数都放到桶之后,从后向前遍历桶,最先得到的 k 个数就是出现频率最多的的 k 个数
func topKFrequent(nums []int, k int) []int {
//nums [1, 1, 4, 2, 2, 3]
//创建map
bucketmap := make(map[int]int)
//初始化最大值
max := 0
//遍历数组
for _, value := range nums {
//给数值是value的键 的值+1
bucketmap[value]++
//更新最大数量值
if bucketmap[value] > max {
max = bucketmap[value]
}
}
//bucketmap map[1:2 2:2 3:1 4:1]
//fmt.Println(bucketmap)
//创建二维切片
bucketlist := make([][]int, max)
//将数量为count个的数字val,放在第count个切片的位置
for val, count := range bucketmap {
bucketlist[count-1] = append(bucketlist[count-1], val)
}
//bucketlist [[4 3] [1 2]]
//fmt.Println(bucketlist)
//创建结果切片
results := make([]int, 0)
//遍历
for i := max-1; i >= 0; i-- {
results = append(results, bucketlist[i]...)
//考虑到可能会有两个数的数量相同,故用二维切片来表示,当前切片如果有两个数,说明这两个数的数量是一样的
k -= len(bucketlist[i])
if k == 0 {
break
}
}
//results [1 2]
return results
}