Hackerrank动态数组超时

时间:2017-02-09 21:09:06

标签: java

当我遇到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需要更长的时间。是这种情况吗?

1 个答案:

答案 0 :(得分:0)

我看到的主要区别在于,在效果不佳的代码中,您为每个内部 ArrayList<Integer>提供了n的初始大小,而在其他代码只是将初始大小提供给外部列表:

group[thing] = new ArrayList<Integer>(n);

VS

group.add(new ArrayList<Integer>());

我猜这是一个错误,并且通过强制每个内部列表的大小为n,您需要创建此算法O(n²)所需的内存空间。< / p>