首页 > 其他分享 >力扣347 前K个高频元素

力扣347 前K个高频元素

时间:2023-01-04 01:11:43浏览次数:48  
标签:pq int 元素 力扣 347 entry new 高频 小顶

题目:

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

示例:

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

思路:

这道题目主要涉及三块内容:

(1)要统计元素出现频率:使用map来进行统计

(2)对频率排序:使用一种 容器适配器就是优先级队列(就是一个披着队列外衣的堆

(3)找出前K个高频元素:用小顶堆,因为要统计最大前k个元素,只有小顶堆每次将最小的元素弹出,最后小顶堆里积累的才是前k个最大元素。

class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        Map<Integer,Integer> map = new HashMap<>();//key为数组元素值,val为对应出现次数
        //1.统计元素出现频率
        for(int num:nums){
            map.put(num,map.getOrDefault(num,0)+1);//遍历,存在num,则次数+1
            //Map.getOrDefault(key,默认值);如果在Map中存在key,对应的value。如果不存在,返回默认值
        }

        //2.对频率排序
     //出现次数按从队头到队尾的顺序是从小到大排,出现次数最低的在队头(相当于小顶堆) PriorityQueue<int[]> pq=new PriorityQueue<>((pair1,pair2)->pair1[1]-pair2[1]); for(Map.Entry<Integer,Integer> entry:map.entrySet()){ if(pq.size()<k){//小顶堆元素个数小于k时直接加 pq.add(new int[]{entry.getKey(),entry.getValue()}); }else{ if(entry.getValue()>pq.peek()[1]){//当前元素出现次数大于小顶堆的根结点 pq.poll();//弹出队头 pq.add(new int[]{entry.getKey(),entry.getValue()}); } } } //3.找出前K个高频元素 int[] ans=new int[k]; for(int i=k-1;i>=0;i--){ ans[i]=pq.poll()[0]; } return ans; } }

 tips:

PriorityQueue<Integer> heap = new PriorityQueue<>(
    (w1, w2) -> w2 - w1    // 第二个参数减第一个是大顶堆
);

 

 

 

 

标签:pq,int,元素,力扣,347,entry,new,高频,小顶
From: https://www.cnblogs.com/cjhtxdy/p/17023703.html

相关文章

  • 力扣113 路径的总和 返回所有满足条件的路径
    力扣113路径的总和返回所有满足条件的路径题目:给你二叉树的根节点root和一个整数目标和targetSum,找出所有从根节点到叶子节点路径总和等于给定目标和的路径。叶......
  • 滴滴前端一面高频vue面试题及答案
    keep-alive使用场景和原理keep-alive是Vue内置的一个组件,可以实现组件缓存,当组件切换时不会对当前组件进行卸载。一般结合路由和动态组件一起使用,用于缓存组件......
  • 力扣112 路径的总和II
    力扣112路径的总和II题目:给你二叉树的根节点root和一个表示目标和的整数targetSum。判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标......
  • 力扣1
    485 最大连续1的个数给定一个二进制数组 nums ,计算其中最大连续 1 的个数。 示例1:输入:nums=[1,1,0,1,1,1]输出:3解释:开头的两位和最后的三......
  • 力扣110 判断是否是平衡二叉树
    力扣110判断是否是平衡二叉树题目:给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对......
  • 力扣107 二叉树的层序遍历
    力扣107二叉树的层序遍历题目:给你二叉树的根节点root,返回其节点值自底向上的层序遍历。(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)示例1:输入:root......
  • 力扣239 滑动窗口最大值
    题目:给你一个整数数组nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k 个数字。滑动窗口每次只向右移动一位。返回......
  • 力扣105 根据先序遍历以及中序遍历构建二叉树
    力扣105根据先序遍历以及中序遍历构建二叉树题目:给定两个整数数组preorder和inorder,其中preorder是二叉树的先序遍历,inorder是同一棵树的中序遍历,请构造二叉树......
  • 校招前端二面高频vue面试题
    vue-router中如何保护路由分析路由保护在应用开发过程中非常重要,几乎每个应用都要做各种路由权限管理,因此相当考察使用者基本功。体验全局守卫:constrouter=createR......
  • 2023前端二面高频vue面试题集锦
    vuex是什么?怎么使用?哪种功能场景使用它?Vuex是一个专为Vue.js应用程序开发的状态管理模式。vuex就是一个仓库,仓库里放了很多对象。其中state就是数据源存放地,对应于......