问题:

题目来源:力扣(LeetCode)

leetcode347.前K个高频元素

难度:中等

分析:
本题解提供四种方法,分别是python的Counter技巧、堆、桶排序、快排。
对于python语言来说,这道题可以用python技巧一行做完,Counter的计数排序功能太强大。
堆天生适合求前k个最大/最小值。
桶适合计数排序的题目。
快排思想也适合寻找k大、k小元素。

解决方法:
1:Counter技巧

#python技巧
#直接使用Counter计数,直接取频数最大的几位
#collections.Counter(nums).most_common(k)代表取频数最大的k位,key和value打包成元组储存在列表中。
#*代表不确定几位,可有多位
#zip将对应位置元素打包成元组
#打包完后,第0个元素就是要求的,但是zip类型不能直接取,得先变成list,然后取第0位。
import collections
class Solution(object):def topKFrequent(self, nums, k):""":type nums: List[int]:type k: int:rtype: List[int]"""return list(zip(*collections.Counter(nums).most_common(k)))[0]

复杂度:O(nlogn)

2:堆方法

#堆方法
#python维护的是最小堆。频数取反入队。先将所有数据的频数和它本身一起存到堆里。频数取反,这样每一次取到的都是最小值,也就是实际上的最大值。
class Solution:def topKFrequent(self, nums: List[int], k: int) -> List[int]:dic = collections.Counter(nums)heap, ans = [], []for i in dic:heapq.heappush(heap, (-dic[i], i))for _ in range(k):ans.append(heapq.heappop(heap)[1])return ans

复杂度:O(nlogn)

3:桶排序

#桶排序,用频数作为桶的标签,往桶里放元素,从频数最大桶开始取,取到数量都k个,就是前k个最大元素。
class Solution:def topKFrequent(self, nums: List[int], k: int) -> List[int]:counter = collections.Counter(nums)n = len(nums)c2 = [[] for _ in range(n + 1)]for v, c in counter.items():c2[c].append(v)res = []for i in range(n, -1, -1):res.extend(c2[i])if len(res) == k:return res

复杂度:O(nlogn)

4:快速排序

#桶排序,用频数作为桶的标签,往桶里放元素,从频数最大桶开始取,取到数量都k个,就是前k个最大元素。
#快速排序
#分切分和找pivot两步走
class Solution:def topKFrequent(self, nums: List[int], k: int) -> List[int]:counter = collections.Counter(nums)val = list(counter.keys())l, r = 0, len(val) - 1while l <= r:pivot = self.partition(val, l, r, counter)if pivot == k - 1:  #刚好找到k个值,结束return val[:k]if pivot > k - 1:   #pivot比k大,说明查找空间还能缩减r = pivot - 1else:   #pivot比k小,说明查找空间在右边一点l = pivot + 1
#切分def partition(self, val, l, r, counter):#随机找一个值,防止pivot值固定,导致切分的两边差距太大。找到pivot,并把pivot值换到最右边ran = random.randint(l, r)val[ran], val[r] = val[r], val[ran]#pivot是最右边的一个值,right指针记录比pivot大的值索引,往数组前面放pivot = rright = lfor i in range(l, r):if counter.get(val[i]) >= counter.get(val[pivot]):  #遇到大于pivot的就向前放val[i], val[right] = val[right], val[i]right += 1  #记录有多少个比pivot大的val[right], val[pivot] = val[pivot], val[right] #将pivot放到所有比它大的值的后面return right    #返回pivot的位置索引

复杂度:O(nlogn)

Leetcode题347、前K个高频元素(Python题解)Amazon面试题相关推荐

  1. Leetcode:347. 前 K 个高频元素(C++)

    目录 问题描述: 实现代码与解析: 基于堆排: 原理思路: 优先级队列: 问题描述: 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素.你可以按 任意顺序 返回答案. ...

  2. 模拟卷Leetcode【普通】347. 前 K 个高频元素

    347. 前 K 个高频元素 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素.你可以按 任意顺序 返回答案. 示例 1: 输入: nums = [1,1,1,2,2 ...

  3. 【LeetCode】【HOT】347. 前 K 个高频元素(哈希表+优先队列)

    [LeetCode][HOT]347. 前 K 个高频元素 文章目录 [LeetCode][HOT]347. 前 K 个高频元素 package hot;import java.util.Arrays ...

  4. LeetCode——347. 前 K 个高频元素【最小堆实现】

    LeetCode--347. 前 K 个高频元素[最小堆实现] 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素.你可以按 任意顺序 返回答案. 示例1: 输入: n ...

  5. Leetcode 347. 前 K 个高频元素

    Leetcode 347. 前 K 个高频元素 1.问题分析 2.问题解决 3.总结 1.问题分析 题目链接:https://leetcode-cn.com/problems/top-k-freque ...

  6. Java实现 LeetCode 347 前 K 个高频元素

    347. 前 K 个高频元素 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输 ...

  7. 力扣347 前 K 个高频元素 -- JS

    347. 前 K 个高频元素 - 力扣(LeetCode) (leetcode-cn.com) 一:使用对象进行解题,对象的属性为给定数组的元素,属性值为给定数组元素出现的次数: 二:把对象转成数组, ...

  8. Suzy找到实习了吗Day 13 | 栈和队列结束啦 239. 滑动窗口最大值,347. 前 K 个高频元素

    day 13 239. 滑动窗口最大值 Python的Deque模块详解 solution 我复制的,好难不会写 347. 前 K 个高频元素(一刷我没有用栈,用的哈希法) solution(hash ...

  9. 代码随想录算法训练营day13 | 239. 滑动窗口最大值 | 347.前 K 个高频元素

    一.239. 滑动窗口最大值 from collections import dequeclass MyQueue: #单调队列(从大到小def __init__(self):self.queue = ...

  10. 力扣347.前 K 个高频元素(优先队列)

    347. 前 K 个高频元素 本题的关键点是对map中的value进行排序. 题目中涉及前几个,考虑优先队列 优先队列要通过lamda表达式写清楚是大数在顶还是小数在顶 逆序: PriorityQue ...

最新文章

  1. ArrayList刷题总结
  2. 倾向得分匹配的stata命令_计量方法的适用条件汇总(二):倾向得分匹配
  3. Magicodes.IE之导入学生数据教程
  4. 推荐一个快速定位深度学习代码bug的炼丹神器!
  5. string转为char数组_StringBuilder的区别是什么?String是不可变?一点课堂(多岸学院)...
  6. Linux学习总结(35)——CentOS 7.X设置服务开机启动
  7. Hosts Setup Utility – 在线更新 hosts
  8. Oracle 11gR2数据库使用
  9. 串口硬盘如何应用于并口硬盘计算机,串口并口硬盘连接具体步骤(转)
  10. GitHup使用指南——安装及上传
  11. php包含大马执行,分析一个常见的php大马并且解码过程
  12. 201903股票投资与实践入门三:资金流向与K线入门
  13. python编写收入支出明细程序_python 处理微信对账单数据的实例代码
  14. 自然语言处理从零到入门 成分句法分析
  15. QTextEdit添加输入提示语
  16. 无套路!最新官宣的1000+微信红包封面,领取入口戳→
  17. 网络带宽和速度的关系
  18. ssm项目——教务系统
  19. properties文件不显示小叶子
  20. 摄影师拍蜗牛乘树叶花下避雨 似撑小伞泛舟

热门文章

  1. 字节跳动/今日头条校招大礼包 2019年校招大礼包
  2. matlab中a2qua,matlab-toolbox-forINS 惯性导航系统的 工具箱,里面包含使用说明以及各个m文件的功能 272万源代码下载- www.pudn.com...
  3. 狼人杀游戏(单人联机)(C++)
  4. 如何给单据分录上增加核算项目的F7(代码示例)。
  5. 【渝粤题库】广东开放大学 基础会计 形成性考核
  6. Python脚本刷网页访问量或关键词搜索频率
  7. 51单片机波形发生器51c语言,51单片机实现波形发生器.doc
  8. fib matlab,基于MATLAB的FIB制备三维原子探针样品过程的模拟方法与流程
  9. 扫地机器人朋友圈文案_扫地机器人方案
  10. AcWing 342. 道路与航线 (双端队列广搜问题,SPFA)