go语言刷题:347. 前 K 个高频元素

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
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值