【LeetCode】347.前 K 个高频元素

今日学习的文章链接和视频链接

leetcode题目地址:347.前 K 个高频元素

 代码随想录题解地址:代码随想录

题目简介

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

看到题目的第一想法(可以贴代码)

1. 想不到怎么使用stack和queue来解决该问题,采用的是直线思维。

先对数组排序,再遍历数组,用hashmap才存储元素值(key)和元素出现的次数(value),然后对hashmap的valueSet进行降序排序,再取前k个元素,作为result。

class Solution {public int[] topKFrequent(int[] nums, int k) {//只有一个元素的情况if(nums.length == 1) return nums;//存储最终结果int[] res = new int[k];//先对原始数组进行排序Arrays.sort(nums);//存储数字和他们出现的频率HashMap<Integer, Integer> hm = new HashMap<Integer, Integer>();int temp = nums[0];int count = 1;for(int i = 1; i < nums.length; i++){//如果和上一个数一致,则该数出现次数+1if(nums[i] == temp){count++;}else{//如果和上一个数不同,则识别为另一个数字的开头hm.put(temp,count);temp = nums[i];count = 1;}//判定是否到末尾,需要回收末尾(末尾只剩一个数 or 末尾连续几个数都一样 时,都只需要put就行)if(i == nums.length - 1){hm.put(temp,count);}}List<Map.Entry<Integer, Integer>> list = new ArrayList<Map.Entry<Integer, Integer>>(hm.entrySet());// 使用Collections.sort()排序,按value,即按出现次数进行排序Collections.sort(list, new Comparator<Map.Entry<Integer, Integer>>() {@Overridepublic int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {return o2.getValue().compareTo(o1.getValue());}});// for-each循环, 获得排序后的结果int index = 0;for (Map.Entry<Integer, Integer> mapping : list){//System.out.println(mapping.getKey() + ":" + mapping.getValue());//判定是否已获取k个最高频数字if(index != k){res[index++] = mapping.getKey();}else{break;}}return res;}
}

实现过程中遇到哪些困难

1. 想不到怎么使用stack和queue来解决该问题

看完代码随想录之后的想法

【解题思路】和我的基本一致,但在对“元素出现频率”进行排序时,我用的是普通排序时间复杂度为n*log(n),答案采用小顶堆排序,时间复杂度为n*log(k)

【想法】无

标准答案

class Solution {//解法2:基于小顶堆实现public int[] topKFrequent2(int[] nums, int k) {Map<Integer,Integer> map = new HashMap<>();//key为数组元素值,val为对应出现次数for(int num:nums){map.put(num,map.getOrDefault(num,0)+1);}//在优先队列中存储二元组(num,cnt),cnt表示元素值num在数组中的出现次数//出现次数按从队头到队尾的顺序是从小到大排,出现次数最低的在队头(相当于小顶堆)PriorityQueue<int[]> pq = new PriorityQueue<>((pair1,pair2)->pair1[1]-pair2[1]);for(Map.Entry<Integer,Integer> entry:map.entrySet()){//小顶堆只需要维持k个元素有序if(pq.size()<k){//小顶堆元素个数小于k个时直接加pq.add(new int[]{entry.getKey(),entry.getValue()});}else{if(entry.getValue()>pq.peek()[1]){//当前元素出现次数大于小顶堆的根结点(这k个元素中出现次数最少的那个)pq.poll();//弹出队头(小顶堆的根结点),即把堆里出现次数最少的那个删除,留下的就是出现次数多的了pq.add(new int[]{entry.getKey(),entry.getValue()});}}}int[] ans = new int[k];for(int i=k-1;i>=0;i--){//依次弹出小顶堆,先弹出的是堆的根,出现次数少,后面弹出的出现次数多ans[i] = pq.poll()[0];}return ans;}
}

学习时长


今日收获

1. 使用Collections.sort()排序,按value排序

List<Map.Entry<Integer, Integer>> list = new ArrayList<Map.Entry<Integer, Integer>>(hm.entrySet());// 使用Collections.sort()排序,按value排序
Collections.sort(list, new Comparator<Map.Entry<Integer, Integer>>() {@Overridepublic int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {return o2.getValue().compareTo(o1.getValue());}
});// for-each循环
int index = 0;
for (Map.Entry<Integer, Integer> mapping : list){System.out.println(mapping.getKey() + ":" + mapping.getValue());if(index != k){res[index++] = mapping.getKey();}else{break;}
}

2. PriorityQueue小顶堆

PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>(); //小顶堆,默认容量为11
PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(11,new Comparator<Integer>(){ //大顶堆,容量11@Overridepublic int compare(Integer i1,Integer i2){return i2-i1;}
});

ps: add自动维持顶部为最小的值。 

3. HashMap获取key序列或value序列

        HashMap<String, Integer> map = new HashMap<String, Integer>();map.put("Kobe", 1);map.put("Jordan", 2);map.put("James", 3);//通过keySet()获取key,再通过map.get(key)获取valueSet<String> set = map.keySet();for(String str : set) {System.out.println(str + " " + map.get(str));}System.out.println( "------------" );//通过map.entrySet()获得键值对,性能较高Set<Entry<String, Integer>> en = map.entrySet();for(Entry<String, Integer> entry : en) {System.out.println(entry.getKey() + " " + entry.getValue());}System.out.println( "------------" );//通过values()取值Collection<Integer> values = map.values();for(Integer i : values)System.out.println(i);	//上面似乎有bug
//-------------------------------------------------------------// 1. 使用 Iterator 遍历 EntrySetIterator < Entry < Integer, String >> iterator = coursesMap.entrySet().iterator();while (iterator.hasNext()) {Entry < Integer, String > entry = iterator.next();System.out.println(entry.getKey());System.out.println(entry.getValue());}// 2. 使用 Iterator 遍历 HashMap KeySetIterator < Integer > iterator = coursesMap.keySet().iterator();while (iterator.hasNext()) {Integer key = iterator.next();System.out.println(key);System.out.println(coursesMap.get(key));}// 3. 使用 For-each 循环遍历 HashMapfor (Map.Entry < Integer, String > entry: coursesMap.entrySet()) {System.out.println(entry.getKey());System.out.println(entry.getValue());}// 4. 使用 Lambda 表达式遍历 HashMapcoursesMap.forEach((key, value) -> {System.out.println(key);System.out.println(value);});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/713028.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

掌握 MySQL 的数据类型

知道了表是由不同数据类型的列组成的&#xff0c;然后填充了一行一行的数据。 当我们要创建表的时候&#xff0c;就要根据业务需求&#xff0c;选择合适的数据类型。比如在实战项目中&#xff0c;文章表就是由下面这些不同数据类型的字段定义的。 目前用到了 bigint、tinyint、…

vue3+ts+vite使用mock数据

安装以下命令 npm i vite-plugin-mock --save-dev npm i mockjs --save-dev 在根路径下创建mock文件夹 mock\user.ts const menuList [{path: /system,component: Layout,name: system,meta: {title: 系统管理,icon: Setting,roles: [sys:manage]},children: [{path: /depar…

Java中使用poi+poi-tl实现根据模板导出word文档

场景 若依管理系统前后端分离版基于ElementUI和SpringBoot怎样实现Excel导入和导出: 若依管理系统前后端分离版基于ElementUI和SpringBoot怎样实现Excel导入和导出_若依导出前端获得到后端的execl流之后怎么操作-CSDN博客 上面讲的是Excel的导出&#xff0c;如果是需要根据w…

即插即用篇 | YOLOv8 引入 MHSA 注意力机制 | 《Bottleneck Transformers for Visual Recognition》

论文名称:《Bottleneck Transformers for Visual Recognition》 论文地址:https://arxiv.org/pdf/2101.11605.pdf 文章目录 1 原理2 源代码3 添加方式4 模型 yaml 文件template-backbone.yamltemplate-small.yamltemplate-large.yamltemplate-neck.yaml

Mac 重新安装系统

Mac 重新安装系统 使用可引导安装器重新安装&#xff08;可用于安装非最新的 Mac OS&#xff0c;系统降级&#xff0c;需要清除所有数据&#xff09; 插入制作好的可引导安装器&#xff08;U盘或者移动固态硬盘&#xff09;&#xff0c;如何制作可引导安装器将 Mac 关机将 Ma…

排序——冒泡排序

冒泡排序的基本思想 从前往后&#xff08;或从后往前&#xff09;两两比较相邻元素的值&#xff0c;若为逆序&#xff08;即 A [ i − 1 ] < A [ i ] A\left [ i-1\right ]<A\left [ i\right ] A[i−1]<A[i]&#xff09;&#xff0c;则交换它们&#xff0c;直到序列…

标准PoE交换机、非标准PoE交换机和非PoE交换机三者到底有何区别?

目录 前言&#xff1a; 一、标准PoE交换机 1.1 工作原理 1.2 应用场景 1、视频监控 2、无线接入点 3、IP电话 1.3 优势 1、简化布线 2、简化安装 3、提高可靠性 二、非标准PoE交换机 2.1 工作原理 2.2 应用场景 1、无线路由器 2、IP电话 3、数据中心 2.3 优势…

c++面试三 -- 智能指针--7000字

一、智能指针 C 中的智能指针是一种用于管理动态分配的内存的对象&#xff0c;它们可以自动进行内存管理&#xff0c;避免内存泄漏和悬挂指针等问题。 1. 悬挂指针 悬挂指针&#xff08;dangling pointer&#xff09;是指在程序中仍然存在但已经不再指向有效内存地址的指针。悬…

IO多路复用 poll模型

poll 是一种在 Linux 系统中进行 I/O 多路复用的模型&#xff0c;它与 select 类似&#xff0c;但具有一些不同之处。poll 允许监视的文件描述符数量不受限制&#xff0c;而不像 select 有一定的限制。 基本概念&#xff1a; poll 函数&#xff1a; 通过 poll 函数&#xff0c…

队列的结构概念和实现

文章目录 一、队列的结构和概念二、队列的实现三、队列的实现函数四、队列的思维导图 一、队列的结构和概念 什么是队列&#xff1f; 队列就是只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出 如上图所示&#x…

【比较mybatis、lazy、sqltoy、mybatis-flex操作数据】操作批量新增、分页查询(二)

orm框架使用性能比较 环境&#xff1a; idea jdk17 spring boot 3.0.7 mysql 8.0比较mybatis、lazy、sqltoy、mybatis-flex操作数据 测试条件常规对象 orm 框架是否支持xml是否支持 Lambda对比版本mybatis☑️☑️3.5.4sqltoy☑️☑️5.2.98lazy✖️☑️1.2.4-JDK17-SNAPS…

Vue+SpringBoot打造天然气工程运维系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统角色分类2.2 核心功能2.2.1 流程 12.2.2 流程 22.3 各角色功能2.3.1 系统管理员功能2.3.2 用户服务部功能2.3.3 分公司&#xff08;施工单位&#xff09;功能2.3.3.1 技术员角色功能2.3.3.2 材料员角色功能 2.3.4 安…

Zabbix企业运维监控工具

Zabbix企业级监控方案 常见监控软件介绍 Cacti Cacti是一套基于 PHP、MySQL、SNMP 及 RRD Tool 开发的监测图形分析工具&#xff0c;Cacti 是使用轮询的方式由主服务器向设备发送数据请求来获取设备上状态数据信息的,如果设备不断增多,这个轮询的过程就非常的耗时&#xff0…

sql注入less46作业三

采用报错注入 updatexml(XML_document,XPath_string,new_value) 一共可以接收三个参数&#xff0c;报错位置在第二个参数。 ?sort1 and updatexml(1,concat(0x7e,database(),0x7e),1)-- #查询库名 ?sort1 and updatexml(1,concat(0x7e,(select group_concat(table_name) fr…

[每周一更]-(第89期):开源许可证介绍

开源代码本就是一种共享精神&#xff0c;一种大无畏行为&#xff0c;为了发扬代码的魅力&#xff0c;创造更多的价值&#xff0c;让爱传递四方&#xff0c;让知识惠及更多人&#xff1b; 写文章也是一种共享精神&#xff0c;让知识传播出去。 介绍下开源中不同许可证的内容限…

初学Vue总结

0 Vue概述 问题&#xff1a;我们已经学过了htmlCssjavascript,可以开发前端页面了&#xff0c;但会发现&#xff0c;效率太低了。那么&#xff0c;有没有什么工具可以提高我们的开发效率&#xff0c;加快开发速度呢&#xff1f; 他来了&#xff0c;他来了&#xff0c;他大佬似…

Spring注解之json 数据处理

目录 1. 过滤 json 数据 2. 格式化 json 数据 3. 扁平化对象 1. 过滤 json 数据 JsonIgnoreProperties 作用在类上用于过滤掉特定字段不返回或者不解析。 //生成json时将userRoles属性过滤 JsonIgnoreProperties({"userRoles"}) public class User { ​private S…

线性规划在多种问题形式下的应用

线性规划的用处非常的广泛&#xff0c;这主要是因为很多类型的问题是可以通过转化的方式转化为线性规划的问题。例如需要再图论中寻找起始点到给定的点的最短路径问题&#xff1a; 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 假设要计算从节点0到节点…

springboot配置多数据源以及事务问题

一、背景以及为什么需要学习 在高并发的项目中,单数据库已无法承载大数据量的访问,因此需要使用多个数据库进行对数据的读写分离,此外就是在微服化的今天,我们在项目中可能采用各种不同存储,因此也需要连接不同的数据库,居于这样的背景,这里简单分享实现的思路以及实现…

点亮城市名片丨计讯物联智慧灯杆系统在通讯基地的成功应用

项目背景 在国家新型城镇化大背景下&#xff0c;十四五规划纲要强调“加快数字化发展&#xff0c;建设数字中国”&#xff0c;明确提出“以数字化助推城乡发展和治理模式创新”&#xff0c;全面提高城市的运行效率和宜居程度。 项目概况 为满足灯杆灯光亮度的远程智能管理、对…