题目来源:
leetcode题目,网址:703. 数据流中的第 K 大元素 - 力扣(LeetCode)
解题思路:
初始化时,初始化 list,记录所给整数 k 并且调用 add 函数逐个将 nums 数组中的元素添加到 list 。
将元素添加值 list 中时,若 list 的大小为0,直接将所给元素添加至 list 中并返回该元素;若list 大小在区间 (0,k) 内,将该元素插入list中并将 list 按从大到小排序,返回 -1 。若 list 的大小大于 k,将该元素插入 list 中,将 list 按从大到小的规律排序并删除最后一个元素,再返回最后一个元素。
解题代码:
//保留前k个,使用二分查找查找该插入的位置
class KthLargest {
int k;
List<Integer> list;//降序排序
public KthLargest(int k, int[] nums) {
this.k=k;
this.list=new ArrayList<>();
for(int num:nums){
this.add(num);
}
}
public int add(int val) {
if(list.size()==0){
list.add(val);
return val;
}
if(list.size()==k && list.get(k-1)>=val)
return list.get(k-1);
int left=0;
int right=list.size()-1;
int pos=-1;
while(left<right){
int middle=left+(right-left)/2;
if(list.get(middle)==val){
pos=middle;
break;
}else if(list.get(middle)>val){
left=middle+1;
}else
right=middle-1;
}
pos=pos==-1?(list.get(left)>val?left+1:left):pos;
list.add(pos,val);
if(list.size()>k){
list.remove(list.size()-1);
}
return list.size()==k?list.get(k-1):-1;
}
}
/**
* Your KthLargest object will be instantiated and called as such:
* KthLargest obj = new KthLargest(k, nums);
* int param_1 = obj.add(val);
*/
//使用二分查找查找该插入的位置
class KthLargest {
int k;
List<Integer> list;//降序排序
public KthLargest(int k, int[] nums) {
this.k=k;
Arrays.sort(nums);
list=new ArrayList<Integer>();
for(int i=nums.length-1;i>=0;i--){
this.list.add(nums[i]);
}
}
public int add(int val) {
if(list.size()==0){
list.add(val);
return val;
}
int left=0;
int right=list.size()-1;
while(left<right){
int middle=left+(right-left)/2;
if(list.get(middle)==val){
list.add(middle,val);
break;
}else if(list.get(middle)>val){
left=middle+1;
}else
right=middle-1;
}
if(left>=right){
int pos=list.get(left)>val?left+1:left;
list.add(pos,val);
}
return list.get(k-1);
}
}
/**
* Your KthLargest object will be instantiated and called as such:
* KthLargest obj = new KthLargest(k, nums);
* int param_1 = obj.add(val);
*/
//添加元素后排序
class KthLargest {
int k;
List<Integer> list;
public KthLargest(int k, int[] nums) {
this.k=k;
list=new ArrayList<Integer>();
for(int num:nums){
this.list.add(num);
}
}
public int add(int val) {
this.list.add(val);
Collections.sort(this.list);
return this.list.get(list.size()-k);
}
}
总结:
官方题解使用的是优先队列。
百度百科中关于优先队列的介绍:在优先队列中,元素被赋予优先级,当访问元素时,具有最高优先级的元素最先删除。
Java 中 PriorityQueue 默认升序排序,即较小的数字具有较高的优先级别。只要确保优先队列中元素个数为 k 个,优先队列队首元素一定为最小的元素(即第 k 大元素)。