LeetCode 786 : [第 K 个最小的素数分数](()
描述:
给你一个按递增顺序排序的数组 arr 和一个整数 k 。数组 arr 由 1 和若干 素数 组成,且其中所有整数互不相同。
对于每对满足 0 <= i < j < arr.length
的 i
和 j
,可以得到分数 arr[i] / arr[j]
。
那么第 k 个最小的分数是多少呢? 以长度为 2 的整数数组返回你的答案, 这里 answer[0] == arr[i]
且 answer[1] == arr[j]
。
[](()解题思路:
-
求第K个最小的素数分数,先建立一个大小为k的大根堆.
-
然后遍历数组,让所有可能的分数遍历一次
-
首先让k个元素放入到堆中,
-
然后再遍历的时候,进行比较,小于堆顶元素的,出堆顶元素,然后入堆.
-
等到遍历结束,堆顶元素就是要得到的元素.
-
此题难点在于重写compare时如何进行比较,分数比较需要用到double,而return的是int.
[](()代码实现:
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();
}
}
[](()第二题: 数据流中的第 K 大元素
====================================================================================
LeetCode 703 : [数据流中的第 K 大元素](()
描述:
设计一个找到数据流中第 k 大元素的类(class)。注意是排序后的第 k 大元素,不是第 k 个不同的元素。
请实现 KthLargest
类:
-
KthLargest(int k, int[] nums)
使用整数 k 和整数流 nums 初始化对象。 -
int add(int val)
将 val 插入数据流 nums 后,返回当前数据流中第 k 大的元素。
[](()解题思路:
-
建立一个大小为k 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 的小根堆.
-
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);
}