前言
算法的重要性不言而喻!区分度高!
现在学习的门槛低了,只有能上网每个人都可以学编程!培训班6个月就可以培养出来能干活的人,你怎么从这些人中脱颖而出?没错!就是学算法,学一些底层和基础的东西。
说的功利点是为了竞争,卷死对手。真心话说就是能提高自己的基础能力,为技术可持续发展做好充分的准备!!!
提前入门学习书籍:CPrimerPlus、大话数据结构
刷题网站
我是按照代码随想录提供的刷题顺序进行刷题的,大家也可以去刷leetcode最热200道,都可以
刷题嘛,最重要的就是坚持了!!!
画图软件
OneNote
这个要经常用,遇见不懂的流程的话就拿它画一画!
笔记软件
Typoral
题目
解析
前k个高频元素什么意思?就是字面意思呗,一组数字中选择出现频率最高的。它还有个更加专业的名字优先级队列
呗!
一图胜千言
- 我们来看图中都说了什么,首先是一个数组中,然后在这个数组中找出前3个高频元素
int[] result = new int[k];
- 更新数组中的数的出现频率,并构建一个map,key为改字母,value为字母出现的次数
HashMap<Integer, Integer> map = new HashMap<>();
for (int num : nums) { map.put(num, map.getOrDefault(num, 0) + 1); }
3. 构建小顶堆
构建小顶堆, 将所有频率将入到堆中,如果堆的大小大于K了,就将元素从堆顶弹出
Set<Map.Entry<Integer, Integer>> entries = map.entrySet(); // 根据map的value值,构建于一个大顶堆(o1 - o2: 小顶堆, o2 - o1 : 大顶堆) PriorityQueue<Map.Entry<Integer, Integer>> queue = new PriorityQueue<>((o1, o2) -> o2.getValue() - o1.getValue()); for (Map.Entry<Integer, Integer> entry : entries) { queue.offer(entry); } for (int i = k - 1; i >= 0; i--) { result[i] = queue.poll().getKey(); }
- 完整代码如下:
class Solution { public int[] topKFrequent(int[] nums, int k) { HashMap<Integer, Integer> map = new HashMap<>(); for (int num : nums) { map.put(num, map.getOrDefault(num, 0) + 1); } Set<Map.Entry<Integer, Integer>> entries = map.entrySet(); // 根据map的value值,构建于一个大顶堆(o1 - o2: 小顶堆, o2 - o1 : 大顶堆) PriorityQueue<Map.Entry<Integer, Integer>> queue = new PriorityQueue<>((o1, o2) -> o2.getValue() - o1.getValue()); for (Map.Entry<Integer, Integer> entry : entries) { queue.offer(entry); } for (int i = k - 1; i >= 0; i--) { result[i] = queue.poll().getKey(); } return result; } }