저는 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²)
있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다