[英]Hackerrank Dynamic Array Timeout
當我遇到這個挑戰時,我正在研究Hackerrank的Data Structures軌道。
我認為我的代碼有效,但我遇到了超時問題。 也就是說,運行大量查詢的輸入似乎需要很長時間。 這是我第一次嘗試解決方案(超時問題):
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需要更長的時間。 是這樣的嗎?
我看到的關鍵區別在於,在性能不佳的代碼中,您為每個內部 ArrayList<Integer>
提供了n
的初始大小,而在其他代碼中,您只是將該初始大小賦予外部列表:
group[thing] = new ArrayList<Integer>(n);
VS
group.add(new ArrayList<Integer>());
我猜這是一個錯誤,並且通過強制每個內部列表的大小為n
你需要使用這個算法O(n²)
所需的內存空間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.