说好去看看面试知识的,不想看,焦虑,控制不住只想做题。。。。
最小的k个数,我一看题目,这不是和我昨天做的第k大的数一样吗?
昨天直接写了个快排,分治什么的根本没看,以前看懂了忘了,现在懒得看了,怕乱。
结果今天又遇到,我想那直接用堆吧,至少不会乱。
优先队列就是用堆实现的,分为大根,小根。默认小根,大根的话要加
(v1,v2)->v2-v1
1/最小的k个元素,是找最小的k个,建了一个大根堆,只要比大根堆的顶头大的就出堆入堆
public int[] getLeastNumbers(int[] arr, int k) {
if(arr.length==0||k==0)return new int[0];
Queue<Integer> que=new PriorityQueue<>((v1,v2)->v2-v1);
int[] b=new int[k];
for(int i=0;i<arr.length;i++){
if(i<k){
que.add(arr[i]);
}else{
if(que.peek()>arr[i]){
que.poll();
que.add(arr[i]);
}
}
}
for(int i=0;i<k;i++){
b[i]=que.poll();
}
return b;
}
我忘了第一句的条件判断。
poll和offer区别,一个空报异常,一个返回空
2、第k大的值
这个用小根堆了
public int findKthLargest(int[] nums, int k) {
Queue<Integer> que=new PriorityQueue<>();
for(int i=0;i<nums.length;i++){
if(i<k){
que.add(nums[i]);
}else{
if(nums[i]>que.peek()){
que.poll();
que.add(nums[i]);
}
}
}
return que.peek();
}
可以说没什么区别