给定一个非空的整数数组,返回其中出现频率前 k 高的元素。

示例 1:

输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2:

输入: nums = [1], k = 1 输出: [1]

提示:

你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。 你的算法的时间复杂度必须优于 O(n log n) , n
是数组的大小。 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。 你可以按任意顺序返回答案。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/top-k-frequent-elements
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

先遍历一遍数组数一数里都各个数都有多少,利用一个哈希表加以存储;然后再想辙从里头取出前k大的若干个数。
取出的方法1,堆排序。创建一个小顶堆(java有自带的priorityqueue),先往里加入k个数,然后再往里加的时候判断,如果要加的数大于堆顶,把堆顶的数扔了加入新的;否则不加入。由于输入数据保证答案唯一,如果出现有和堆顶相同的说明堆顶和这个都不在最终答案里头,直接不管就成:

class Solution {void addNum(HashMap<Integer, Integer> freq, int num) {if(freq.containsKey(num)) {freq.put(num, freq.get(num) + 1);} else {freq.put(num, 1);}return;}public int[] topKFrequent(int[] nums, int k) {//哈希表加堆排序HashMap<Integer, Integer> freq = new HashMap<>();for(int i = 0; i < nums.length; ++i) {addNum(freq, nums[i]);}PriorityQueue<Map.Entry<Integer, Integer>> heap = new PriorityQueue<>(k, new Comparator<Map.Entry<Integer, Integer>>() {public int compare(Map.Entry<Integer, Integer> e1, Map.Entry<Integer, Integer> e2) {return e1.getValue() - e2.getValue();}});var it = freq.entrySet().iterator();for(int i = 0; i < k; ++i) {var entry = it.next();heap.add(entry);}while(it.hasNext()) {var entry = it.next();if(entry.getValue() > heap.peek().getValue()) {heap.poll();heap.add(entry);}}int[] ans = new int[k];var qit = heap.iterator();for(int i = 0; i < k; ++i) {ans[i] = qit.next().getKey();}return ans;}
}

看了下题解,可以利用找一半的快速排序来做这件事情。说起来这种方法好像也是算法导论里头讲的方法来着。快排一轮结束后,m的左边比m小右边比m大,要找前k大的看看m右边到r有几个数。如果比k小就先把m和它右边的数都填到答案里头,再到左边找k - (r - m + 1)个数,如果比k大直接去右边找就好,如此迭代即可:

class Solution {void addNum(HashMap<Integer, Integer> freq, int num) {if(freq.containsKey(num)) {freq.put(num, freq.get(num) + 1);} else {freq.put(num, 1);}return;}void swap(int[] arr1, int[] arr2, int index1, int index2) {int t = arr1[index1];arr1[index1] = arr1[index2];arr1[index2] = t;t = arr2[index1];arr2[index1] = arr2[index2];arr2[index2] = t;}void rec(int[] numArr, int[] freqArr, int l, int r, int[] ans, int ansIndex) {//System.out.println("l = " + l + " r = " + r);if(l > r || ans.length == ansIndex)return;int pIndex = new Random().nextInt(r - l + 1) + l;swap(numArr, freqArr, pIndex, r);int ll = l, rr = r - 1;while(ll < rr) {if(freqArr[ll] >= freqArr[r]) {swap(numArr, freqArr, ll, rr);--rr;} else {++ll;}}if(freqArr[ll] < freqArr[r])++ll;//此时ll左边的都比p小if(r - ll + 1 <= ans.length - ansIndex) {for(int i = 0; i < r - ll + 1; ++i) {ans[ansIndex++] = numArr[ll + i];}rec(numArr, freqArr, l, ll - 1, ans, ansIndex);} else {rec(numArr, freqArr, ll, r, ans, ansIndex);}}public int[] topKFrequent(int[] nums, int k) {//哈希表加堆排序HashMap<Integer, Integer> freq = new HashMap<>();for(int i = 0; i < nums.length; ++i) {addNum(freq, nums[i]);}int[] numArr = new int[freq.size()];int[] freqArr = new int[freq.size()];var it = freq.entrySet().iterator();for(int i = 0; it.hasNext(); i++) {var entry = it.next();numArr[i] = entry.getKey();freqArr[i] = entry.getValue();}int[] ans = new int[k];rec(numArr, freqArr, 0, numArr.length - 1, ans, 0);return ans;}
}

u1s1 java 不循序generic array真的很不爽啊。

2020_9_7 每日一题 前 K 个高频元素相关推荐

  1. 力扣刷题-前k个高频元素

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

  2. 【20230401】【每日一题】前K个高频元素

    给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素.你可以按 任意顺序 返回答案. 统计元素出现的频率 ---用map 对出现的频率进行排序---优先级队列 找出前K个 ...

  3. Leetcode题347、前K个高频元素(Python题解)Amazon面试题

    问题: 题目来源:力扣(LeetCode) leetcode347.前K个高频元素 难度:中等 分析: 本题解提供四种方法,分别是python的Counter技巧.堆.桶排序.快排. 对于python ...

  4. leetcode:前 K 个高频元素、删除字符串中的所有相邻重复项、有多少小于当前数字的数字、有效的山脉数组、独一无二的出现次数(JavaScript)

    文章目录 347. 前 K 个高频元素 思路 1047. 删除字符串中的所有相邻重复项 思路 1365. 有多少小于当前数字的数字 思路 优化 继续优化 完整代码 941. 有效的山脉数组 思路 12 ...

  5. (补)算法训练Day13 | LeetCode150. 逆波兰表达式求值(栈应用);LeetCode239. 滑动窗口最大值(单调队列);LeetCode347. 前K个高频元素(小顶堆,优先级队列)

    目录 LeetCode150. 逆波兰表达式求值 1. 思路 2. 代码实现 3. 复杂度分析 4. 思考 LeetCode239. 滑动窗口最大值 1. 思路 2. 代码实现 3. 复杂度分析 4. ...

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

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

  7. 前K个高频元素(top k)(TX)

    思路 这道题目主要涉及到如下三块内容: 1.要统计元素出现频率 2.对频率排序 3.找出前K个高频元素 首先统计元素出现的频率,这一类的问题可以使用map来进行统计. 然后是对频率进行排序,这里我们可 ...

  8. 统计list里面相同元素个数_LeetCode 第 347 号问题:前 K 个高频元素

    本文首发于公众号「五分钟学算法」,是图解 LeetCode 系列文章之一. 个人网站:https://www.cxyxiaowu.com 今天分享的题目来源于 LeetCode 上第 347 号问题: ...

  9. 215.数组中的第K个最大元素/347. 前 K 个高频元素

    2020-05-25 1.题目描述 数组中的第K个最大元素 2.题解 1.使用冒泡排序 2.使用快速排序 3.优先队列(内部是用堆来实现的) 3.代码 class Solution { public: ...

最新文章

  1. 转:【AI每日播报】从TensorFlow到Theano:横向对比七大深度学习框架
  2. opencv mat2 ffmpeg frame
  3. pyqt5 子线程更新ui
  4. 分享一下:推荐一个网站,练习CSS3
  5. linux 线程池编程,Linux-C-9-线程池编程
  6. MySQL服务器状态变量
  7. python风格logo_感觉logo不给力? Python十分钟制作属于你自己的个性logo
  8. 树莓派4B开机自动挂载移动硬盘,以及遇到the root account is locked问题
  9. c++11 多线程编程(一)------初始
  10. itex将html转成pdf加水印,Springboot 中集成itextpdf HTML转PDF并添加水印(支持中文)
  11. linux屏幕截图之滚动截屏
  12. CNKI 中国知网全文数据库账户密码免费入口
  13. bzoj 4134: ljw和lzr的hack比赛 sg函数+字典树
  14. 易企秀把作品转赠给别人,让别人可以编辑
  15. python画公主_【图片】来几张公主的手绘【勇敢的公主吧】_百度贴吧
  16. Arduino灰度传感器PID巡线
  17. (转载)酷炫桌面背景图片,实用命令图片
  18. 双目立体图像矫正方法简述
  19. Java、JSP地铁线路查询系统
  20. Android知识大全

热门文章

  1. Tenorshare UltData for Mac(iOS数据恢复备份软件)
  2. WPF 自定义CheckBox样式
  3. 从阿尔法策略到阿尔法对冲策略
  4. idata界面_iData
  5. [歌词创作] 一首歌的结构
  6. 一个 Vue 页面的内存泄露分析
  7. android.content.ActivityNotFoundException: No Activity found to handle Intent { act=com.lby.action }
  8. 爱迪生的复仇:直流电的崛起
  9. 收集一下国外黑客网址
  10. agisoft delighter去除光影测试