我正在解决Hackerrank上的一个问题,我相信我的逻辑或多或少是正确的,但是较大的数据集会降低性能,从而给我一个错误的"回答。以下是问题的链接,以便您查看:
https://www.hackerrank.com/challenges/qheap1
我想知道如何提高此脚本的性能,以便允许更大的数据集。我有一个与扫描仪有关的预感,但我不知道为什么。
public class Solution {
private static final int ADD = 1;
private static final int DELETE = 2;
private static final int GET = 3;
private static final int TICK = 1;
public static void main(String[] args) {
/* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution. */
Scanner in = new Scanner(System.in);
PrintStream out = System.out;
int n = in.nextInt();
int[] heap = new int[n];
int a = 0;
while (a < n) {
a = 0;
int q = in.nextInt();
switch(q) {
case(ADD):
int nextAdd = in.nextInt();
/*out.println("ADD " + next);*/
int b = 0;
while (b < n) {
/*out.println(heap[b]);*/
if (heap[b] == 0) {
heap[b] = nextAdd+TICK;
/*printArray(heap);*/
b = n-1;
}
b++;
}
/*printArray(heap);*/
break;
case(DELETE):
int c = 0;
int nextDelete = in.nextInt();
while (c < n) {
if (heap[c]-TICK == nextDelete) {
heap[c] = 0;
c = n-1;
}
c++;
}
/*printArray(heap);*/
break;
case(GET):
Arrays.sort(heap);
int d = 0;
while (d < n) {
if (heap[d] != 0) {
out.println(heap[d]-TICK);
d = n-1;
}
d++;
}
/*printArray(heap);*/
break;
}
a++;
/*printArray(heap);*/
}
}
public static void printArray(int[] ar) {
String str = "";
for (int i : ar) {
str += i + " ";
}
System.out.println(str);
}
}
答案 0 :(得分:1)
查看您的代码,我能发现的唯一立即问题是这一行的事实
out.println(heap[d]-TICK);
没有被评论出来。这可能意味着你的java程序(不,它不是脚本,请注意你的措辞!)正在进行大量的IO操作。与您计划中的其他任何内容相比,这些昂贵。
所以,评论一下然后看看会发生什么。
答案 1 :(得分:1)
您的方法存在的主要问题是您没有使用堆(因为挑战需要),您在使用数组时花费了太多时间。
以下是通过所有测试的实现:
public static void main(String[] args) {
final Scanner in = new Scanner(System.in);
final int n = in.nextInt();
final PriorityQueue<Integer> q = new PriorityQueue<>(n);
for (int i = 0; i < n; i++) {
final int command = in.nextInt();
switch (command) {
case 1:
q.add(in.nextInt());
break;
case 2:
q.remove(in.nextInt());
break;
case 3:
System.out.println(q.peek());
break;
}
}
}