如何在 O(1) 空间中打印 PriorityQueue 的降序
Posted
技术标签:
【中文标题】如何在 O(1) 空间中打印 PriorityQueue 的降序【英文标题】:How to Print decreasing order of the PriorityQueue in O(1) Space 【发布时间】:2020-08-16 20:20:19 【问题描述】:我正在解决堆上的问题,我希望使用 PriorityQueue 以降序输出问题。 输入: 1 5 2 12 5 787 1 23 输出: 23 787 想要的输出: 787 23
class GFG
public static void main(String args[])throws IOException
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
while(t-->0)
// take array and kth element iput
String n_k[] = br.readLine().split(" ");
// store array size in n && kth element to find in k
int n = Integer.parseInt(n_k[0]);
int k = Integer.parseInt(n_k[1]);
// Array String input
String s[] = br.readLine().split(" ");
int d[] = new int[n];
for(int i = 0 ; i < n ; i++)
d[i] = Integer.parseInt(s[i]);
PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>();
// delete the minimum element in the element and just keep
// k greater element in the minHeap
for(int i = 0 ; i < n; i++)
minHeap.add(d[i]);
// if size of heap increases pop tht last element
if(minHeap.size()>k)
minHeap.poll();
// print remaining element
//HERE IS THE PROBLEM I WANT IT IN " DECREASING ORDER "
// it gives me Increasing order
while(minHeap.size() > 0)
System.out.print(minHeap.peek()+" ");
minHeap.poll();
System.out.println();
// end of while
// end of main
// end of class
输入: 1 5 2 12 5 787 1 23 输出: 23 787
【问题讨论】:
【参考方案1】:您可以使用Stream
打印结果:
try (Scanner scan = new Scanner(System.in))
int totalCases = scan.nextInt();
while (totalCases-- > 0)
int n = scan.nextInt();
int k = scan.nextInt();
Queue<Integer> minHeap = new PriorityQueue<>(k);
for (int i = 0; i < n; i++)
if (minHeap.size() == k)
minHeap.remove();
minHeap.add(scan.nextInt());
System.out.println(minHeap.stream()
.sorted(Comparator.reverseOrder())
.map(String::valueOf)
.collect(Collectors.joining(" ")));
【讨论】:
是的,使用 Stream 它解决了我在 O(1) 空间中的问题!谢谢!【参考方案2】:只需用下面的代码替换您的代码。
在声明优先级队列时,您可以提供倒序比较器。
PriorityQueue newHeap = new PriorityQueue(minHeap.size(),Comparator.reverseOrder());
在这里,我创建了一个 newHeap,它将所有现有元素存储在 reverseOrder 中,然后按原样执行所有现有操作。
它给出了预期的答案。
1
5 2
12 5 787 1 23
O/P
787 23
这会对你有所帮助。
class GFG
public static void main(String args[]) throws IOException
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
while (t-- > 0)
String n_k[] = br.readLine().split(" ");
int n = Integer.parseInt(n_k[0]);
int k = Integer.parseInt(n_k[1]);
String s[] = br.readLine().split(" ");
int d[] = new int[n];
for (int i = 0; i < n; i++)
d[i] = Integer.parseInt(s[i]);
PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>();
for (int i = 0; i < n; i++)
minHeap.add(d[i]);
// if size of heap increases pop tht last element
if (minHeap.size() > k)
minHeap.poll();
PriorityQueue<Integer> newHeap = new PriorityQueue(minHeap.size(), Comparator.reverseOrder());
newHeap.addAll(minHeap);
while (newHeap.size() > 0)
System.out.print(newHeap.peek() + " ");
newHeap.poll();
System.out.println();
【讨论】:
不会添加PriorityQueue
使空间复杂度 O(n) ,如果我错了,请纠正我。谢谢你。以上是关于如何在 O(1) 空间中打印 PriorityQueue 的降序的主要内容,如果未能解决你的问题,请参考以下文章