簡體   English   中英

Hackerrank動態數組超時

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM