前k个高频元素力扣--347

devtools/2025/1/23 8:32:04/

目录

题目

思路

代码


题目

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= nums.length <= 105
  • k 的取值范围是 [1, 数组中不相同的元素的个数]
  • 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的

思路

需要统计每个数字出现的次数,想到用map,key存储数字,value存储他出现的次数。

 求前k个出现频率最高的,不用给全部排序,排出前k个即可,想到用大根堆或小根堆

采用小根堆。当存储的数大于k时,往里存一个就弹出一个,小根堆小的在顶部,而弹出也是弹出顶部的元素,所以最后剩的就是最大的k个。

代码

class Solution {public int[] topKFrequent(int[] nums, int k) {// 优先级队列,为了避免复杂 api 操作,pq 存储数组// lambda 表达式设置优先级队列从大到小存储 o1 - o2 为从小到大,o2 - o1 反之PriorityQueue<int[]> pq = new PriorityQueue<>((o1, o2) -> o1[1] - o2[1]);int[] res = new int[k]; // 答案数组为 k 个元素Map<Integer, Integer> map = new HashMap<>(); // 记录元素出现次数for (int num : nums) map.put(num, map.getOrDefault(num, 0) + 1);for (var x : map.entrySet()) { // entrySet 获取 k-v Set 集合// 将 kv 转化成数组int[] tmp = new int[2];tmp[0] = x.getKey();tmp[1] = x.getValue();pq.offer(tmp);// 下面的代码是根据小根堆实现的,我只保留优先队列的最后的k个,只要超出了k我就将最小的弹出,剩余的k个就是答案if(pq.size() > k) {pq.poll();}}for (int i = 0; i < k; i++) {res[i] = pq.poll()[0]; // 获取优先队列里的元素}return res;}
}


http://www.ppmy.cn/devtools/152829.html

相关文章

PortSwigger靶场练习---网页 LLM 攻击:利用LLM API 的漏洞

网页 LLM 攻击&#xff1a; Exploiting vulnerabilities in LLM APIs 利用LLM API 的漏洞 PortSwigger靶场地址&#xff1a; Dashboard | Web Security Academy - PortSwigger 题目&#xff1a; 官方提示&#xff1a; 从实验室主页点击实时聊天。 询问LLM它有权访问哪些 API…

yolov11 推理保存json

目录 yolov11 推理保存json 推理图片目录: yolov11 推理保存json import glob import json import os import shutilimport cv2 import timeimport numpy as np import torch# import torch from ultralytics import YOLOmodel = YOLO(r"yolo11x.pt")dir_path = …

神经网络:什么是交叉熵?

在机器学习和深度学习中&#xff0c;交叉熵&#xff08;Cross Entropy&#xff09; 是一种常见的损失函数&#xff0c;特别适用于分类问题。尽管这个术语听起来可能有点复杂&#xff0c;但通过一个类比&#xff0c;我们可以更直观地理解它的含义和作用。 类比场景&#xff1a;…

Mac 刷题环境配置

Mac 刷题环境配置 这篇博文主要记录自己为了更方便的在 Mac 上写算法题&#xff0c;主要是基于 Clion做的一些环境配置&#xff1b;有些操作其实在 Windows &#xff0c;Linux 下也是通用的&#xff0c;如果看到的小伙伴也可以结合自己的情况参考。 Clion 插件 推荐一下这个插件…

Java 的对象序列化与反序列化

目录 一、什么是对象序列化与反序列化 二、为何需要对象序列化与反序列化 三、Java 中如何实现对象序列化与反序列化 1. 简单对象的序列化与反序列化 2. 处理静态成员与瞬态成员 四、自定义序列化与反序列化逻辑 五、对象序列化与反序列化的注意事项 六、总结 在 Java …

人形机器人将制造iPhone!

前言 优必选机器人和富士康通过一项突破性的合作伙伴关系&#xff0c;正在将先进的人形机器人&#xff08;如Walker S1及其升级版Walker S2&#xff09;整合到制造流程中&#xff0c;以改变iPhone的生产方式。这一合作旨在通过提升机器人能力、优化工作流程以及实现更智能的自动…

Elasticsearch 8.17.1 JAVA工具类

一、ElasticSearchUtils package com.wssnail.elasticsearch.util;import co.elastic.clients.elasticsearch.ElasticsearchClient; import co.elastic.clients.elasticsearch._types.FieldValue; import co.elastic.clients.elasticsearch._types.Refresh; import co.elasti…

cf<contest/1971>练习-python版

https://codeforces.com/contest/1971 前5题python题解&#xff08;cf翻译代码符号可能变中文&#xff09; 1.My First Sorting Problem 题面翻译 有 t t t 组数据&#xff0c;每组数据给你两个整数 x x x 和 y y y 。 输出两个整数&#xff1a; x x x 和 y y y 中较小…