}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();
}
}
====================================================================================
LeetCode 703 : 数据流中的第 K 大元素
描述:
设计一个找到数据流中第 k 大元素的类(class)。注意是排序后的第 k 大元素,不是第 k 个不同的元素。
请实现 KthLargest
类:
-
KthLargest(int k, int[] nums)
使用整数 k 和整数流 nums 初始化对象。 -
int add(int val)
将 val 插入数据流 nums 后,返回当前数据流中第 k 大的元素。
-
建立一个大小为k的小根堆.
-
add的时候,将val入队,如果堆没满直接入队,堆满了,需要判断之后再决定是否入队.
-
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();
}
}
=================================================================================
LeetCode 347: 前 K 个高频元素
描述:
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
-
使用map,key值为数组出现的数据,value值记录key出现的次数.
-
使用优先级队列,构建一个大小为k的小根堆,比较的是value的大小.
-
map添加的数据是有序的,所以直接遍历map,让数据入队.
-
当堆的大小 > k的时候,要弹出队顶元素,
-
遍历结束后,堆中的数据就是所需数据.
-
定义一个长度为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获取)
面试题总结
其它面试题(springboot、mybatis、并发、java中高级面试总结等)
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
*
[外链图片转存中…(img-OQZrWMDD-1713462552684)]
[外链图片转存中…(img-LBZOBhhf-1713462552685)]
[外链图片转存中…(img-oeuLP0B0-1713462552688)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!