【发布时间】:2021-06-22 21:00:07
【问题描述】:
如果我有一个大小为 4 的 PriorityQueue,并且我正在迭代一个大小为“n”的数组,并且我只想要数组中的 4 个最大元素。当我到达数组的末尾时,这个程序是否花费了 O(n) 时间或 O(nlogn) 时间。我知道 PQ add() 和 remove() 需要 O(logn),但是因为 PQ 大小永远不会大于 4,这是否意味着这是一个 O(n) 程序。
这里是代码,如果你想参考
class Solution {
public int minDifference(int[] nums) {
if(nums.length <= 4) return 0;
PriorityQueue<Integer> maxq = new PriorityQueue();
PriorityQueue<Integer> minq = new PriorityQueue(new Comparator<Integer>(){
public int compare(Integer a, Integer b){
return (a - b) * -1;
}
});
for(int i = 0; i < nums.length; i++){
if(minq.size() < 4){
minq.add(nums[i]);
maxq.add(nums[i]);
}else
{
if(nums[i] > maxq.peek()){
maxq.poll();
maxq.add(nums[i]);
}
if(nums[i] < minq.peek()){
minq.poll();
minq.add(nums[i]);
}
}
}
int smallest4 = minq.poll();
int smallest3 = minq.poll();
int smallest2 = minq.poll();
int smallest = minq.poll();
int biggest4 = maxq.poll();
int biggest3 = maxq.poll();
int biggest2 = maxq.poll();
int biggest = maxq.poll();
int remove3End = biggest4 - smallest;
int remove3Beg = biggest - smallest4;
int twoEnd_oneStart = biggest3 - smallest2;
int oneEnd_twoStart = biggest2 - smallest3;
int a = Math.min(remove3End,remove3Beg);
int b = Math.min(twoEnd_oneStart, oneEnd_twoStart);
return Math.min(a,b);
}
}```
【问题讨论】:
标签: queue time-complexity big-o priority-queue