class Solution {
public static int[] kthSmallestPrimeFraction(int[] arr, int k) {
PriorityQueue<int[]> priorityQueue = new PriorityQueue<>(k,new Comparator<int[]>(){
@Override
public int compare(int[] o1, int[] o2) {
double a1 = o1[0]*1.0 / o1[1];
double a2 = o2[0]*1.0 / o2[1];
int flg = 0;//用flg来返回
if(a2 - a1 < 0) flg = -1;
else if (a2 - a1 > 0) flg = 1;
return flg;
}
});//大根堆.
for (int i = 0; i < arr.length - 1; i++) {
for (int j = i+1 ; j < arr.length; j++) {
if(priorityQueue.size() < k){
priorityQueue.offer(new int[]{arr[i],arr[j]});
}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是次数
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!**
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!