LeetCode 堆(优先级队列) 相关题目(1)

}else {

double top = priorityQueue.peek()[0] * 1.0 / priorityQueue.peek()[1];

double tmp = arr[i] * 1.0 / arr[j];

if(tmp < top){//这里的比较也要double.

priorityQueue.poll();

priorityQueue.offer(new int[]{arr[i],arr[j]});

}

}

}

}

return priorityQueue.peek();

}

}

第二题: 数据流中的第 K 大元素

====================================================================================

LeetCode 703 : 数据流中的第 K 大元素

描述:

设计一个找到数据流中第 k 大元素的类(class)。注意是排序后的第 k 大元素,不是第 k 个不同的元素。

请实现 KthLargest 类:

  • KthLargest(int k, int[] nums) 使用整数 k 和整数流 nums 初始化对象。

  • int add(int val) 将 val 插入数据流 nums 后,返回当前数据流中第 k 大的元素。

解题思路:


  1. 建立一个大小为k的小根堆.

  2. add的时候,将val入队,如果堆没满直接入队,堆满了,需要判断之后再决定是否入队.

  3. add的类型为int,返回直接返回堆顶元素即可.

代码实现:


class KthLargest {

final PriorityQueue priorityQueue;

final int k ;

public KthLargest(int k, int[] nums) {

this.k = k;

priorityQueue = new PriorityQueue<>(this.k, new Comparator() {

@Override

public int compare(Integer o1, Integer o2) {

return o1 - o2;

}

});

for (int val:nums) {

add(val);

}

}

public int add(int val) {

if(priorityQueue.size() < k){

priorityQueue.offer(val);

}else {

if(val > priorityQueue.peek()){

priorityQueue.poll();

priorityQueue.offer(val);

}

}

return priorityQueue.peek();

}

}

第三题: 前 K 个高频元素

=================================================================================

LeetCode 347: 前 K 个高频元素

描述:

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

在这里插入图片描述

解题思路:


  1. 使用map,key值为数组出现的数据,value值记录key出现的次数.

  2. 使用优先级队列,构建一个大小为k的小根堆,比较的是value的大小.

  3. map添加的数据是有序的,所以直接遍历map,让数据入队.

  4. 当堆的大小 > k的时候,要弹出队顶元素,

  5. 遍历结束后,堆中的数据就是所需数据.

  6. 定义一个长度为k的数组,让key的值放入数组中即可.

代码实现:


public int[] topKFrequent(int[] nums, int k) {

int[] arr = new int[k];//长度为k的数组arr

Map<Integer,Integer> map = new HashMap<>();

//map记录数据出现的次数 key是数据,value是次数

for (int i:nums) {

map.put(i,map.getOrDefault(i,0)+1);

}

Set<Map.Entry<Integer, Integer>> entrySet = map.entrySet();

PriorityQueue<Map.Entry<Integer,Integer>> pq = new PriorityQueue<>(new Comparator<Map.Entry<Integer, Integer>>() {

@Override

public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {

return o1.getValue()-o2.getValue();//比较的是出现次数

}

});

for (Map.Entry<Integer,Integer> entry:entrySet) {

pq.offer(entry);//map是有序的,所以每次遍历只需要入队就可以了

if(pq.size() > k){

pq.poll();//堆大小>k 出队

}

}

for (int i = k - 1; i >= 0; i–) {

arr[i] = pq.poll().getKey();

}//将数据添加到数组arr中
return arr;

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!**

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值