LeetCode每日1题--前 K 个高频元素

80 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第23天,点击查看活动详情

前言

算法的重要性不言而喻!区分度高!

现在学习的门槛低了,只有能上网每个人都可以学编程!培训班6个月就可以培养出来能干活的人,你怎么从这些人中脱颖而出?没错!就是学算法,学一些底层和基础的东西。

说的功利点是为了竞争,卷死对手。真心话说就是能提高自己的基础能力,为技术可持续发展做好充分的准备!!!

提前入门学习书籍:CPrimerPlus、大话数据结构

image-20220705103735001

刷题网站

代码随想录 (programmercarl.com)

leetcode

我是按照代码随想录提供的刷题顺序进行刷题的,大家也可以去刷leetcode最热200道,都可以

刷题嘛,最重要的就是坚持了!!!

画图软件

OneNote

这个要经常用,遇见不懂的流程的话就拿它画一画!

笔记软件

Typoral

题目

image.png

解析

前k个高频元素什么意思?就是字面意思呗,一组数字中选择出现频率最高的。它还有个更加专业的名字优先级队列呗!

一图胜千言

347.前K个高频元素

  1. 我们来看图中都说了什么,首先是一个数组中,然后在这个数组中找出前3个高频元素

int[] result = new int[k];

  1. 更新数组中的数的出现频率,并构建一个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();
        }
  1. 完整代码如下:
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;
    }
}