当我遇到challenge时,我正在Hackerrank的数据结构轨道上工作。
我认为我的代码有效,但我遇到了超时问题。也就是说,运行大量查询的输入似乎需要很长时间。这是我第一次尝试解决方案(超时问题):
import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
public class Solution {
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 sc = new Scanner(System.in);
int n = sc.nextInt();
int q = sc.nextInt();
ArrayList<Integer>[] group = (ArrayList<Integer>[])new ArrayList[n];
int lastAns = 0;
ArrayList<Integer> curr = null;
//int currVal = 0;
for(int i = 0;i < q;i++){
int query = sc.nextInt();
int x = sc.nextInt();
int y = sc.nextInt();
int thing = (x^lastAns) % n;
if(query == 1){
if(group[thing] == null){
group[thing] = new ArrayList<Integer>(n);
}
curr = group[thing];
curr.add(y);
}else if(query == 2){
curr = group[thing];
lastAns = curr.get(y % curr.size());
System.out.println(lastAns);
}
}
sc.close();
}
}
以下是没有超时问题的代码:
import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
public class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int q = sc.nextInt();
int lastAns = 0;
ArrayList<ArrayList> group = new ArrayList();
ArrayList<Integer> curr = null;
//int currVal = 0;
for (int i = 0; i < n; i++){
group.add(new ArrayList<Integer>());
}
for(int i = 0;i < q;i++){
int query = sc.nextInt();
int x = sc.nextInt();
int y = sc.nextInt();
int thing = (x^lastAns) % n;
if(query == 1){
curr = group.get(thing);
curr.add(y);
}else if(query == 2){
curr = group.get(thing);
lastAns = curr.get(y % curr.size());
System.out.println(lastAns);
}
}
sc.close();
}
}
我的问题是:解决超时问题的不同之处是什么?我的第一个猜测是,数组访问/更改元素比使用ArrayLists需要更长的时间。是这种情况吗?
答案 0 :(得分:0)
我看到的主要区别在于,在效果不佳的代码中,您为每个内部 ArrayList<Integer>
提供了n
的初始大小,而在其他代码只是将初始大小提供给外部列表:
group[thing] = new ArrayList<Integer>(n);
VS
group.add(new ArrayList<Integer>());
我猜这是一个错误,并且通过强制每个内部列表的大小为n
,您需要创建此算法O(n²)
所需的内存空间。< / p>