Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 由于我的黑客等级解决方案超时而终止_Java_Arrays_Performance_Collections - Fatal编程技术网

Java 由于我的黑客等级解决方案超时而终止

Java 由于我的黑客等级解决方案超时而终止,java,arrays,performance,collections,Java,Arrays,Performance,Collections,大家好,请检查问题 这是我对上述问题的解决方案(链接) static int migratoryBirds(列表arr){ int ar[]=新int[arr.size()]; 对于(int i=0;i ar[maxAt]?i:maxAt; } 返回arr.get(maxAt); } 当数组大小较大时,我的代码无法处理,例如数组中的17623个元素 由于超时而终止 问题出现在第二个for循环中,该循环在数组中迭代,并为我提供数组中最大数字的索引。是否有其他方法可以提高性能。您的问题是调用col

大家好,请检查问题

这是我对上述问题的解决方案(链接)

static int migratoryBirds(列表arr){
int ar[]=新int[arr.size()];
对于(int i=0;i ar[maxAt]?i:maxAt;
}
返回arr.get(maxAt);
}
当数组大小较大时,我的代码无法处理,例如数组中的17623个元素

由于超时而终止


问题出现在第二个for循环中,该循环在数组中迭代,并为我提供数组中最大数字的索引。是否有其他方法可以提高性能。

您的问题是调用collections.frequency,这是一个O(N)操作。当您从循环内部调用它时,它将变为O(N²)这会消耗你所有的时间

另外,您确定您收到的是列表的哪个实现吗?您可以调用List.get(i),如果该实现是LinkedList,那么它也可能是O(N)

本练习的目标是计算输入一次传递中每个值的频率。您需要一个位置来存储和增加每个值的出现次数,并且需要存储输入的最大值


您还跳过了规范的一个关键部分。输入有一些限制,使得解决问题比您现在想象的要容易。

您的问题就在这一部分:

for(int i = 0; i < arr.size(); i++)
    ar[i] = Collections.frequency(arr, arr.get(i));
这里还有一个:

static int migratoryBirds(List<Integer> arr) {
    int freq[]=new int[6];
    for(int i=0;i<arr.size();i++){
        ++freq[arr.get(i)];
    }
    int maxAt = 1;
    for (int i = 2; i < freq.length; i++) {
        if (freq[i] > freq[maxAt]) {
            maxAt = i;
        }
    }
    return maxAt;
}
static int migratoryBirds(列表arr){
int freq[]=新的int[6];
对于(int i=0;i freq[maxAt]){
maxAt=i;
}
}
返回maxAt;
}
我们可以在一个循环中确定最常见鸟类的类型编号。这具有时间复杂性O(n)

static int migratoryBirds(int[]arr){
int最高频率=0;
int highestFrequencyBirdType=0;
int[]frequencies=new int[5];//共有5种鸟类类型
for(int-birdType:arr){
int frequency=++频率[birdType-1];
中频(频率>最高频率){
最高频率=频率;
highestFrequencyBirdType=birdType;
}else if(频率==最高频率和鸟型<最高频率鸟型){
highestFrequencyBirdType=birdType;
}
}
返回最高频BIRDTYPE;
}

对于数组
arr
中的每个元素,我们更新总体
最高频率
,并存储表示
最高频率鸟类类型
的相应值。如果两种不同的鸟类类型具有最高频率,则较低类型(ID号最小)已设置。

它不是链表,而是数组列表。还有没有其他方法或方法来获取Arraylist@Torbent中元素的出现率此练习的目的是让您找出方法。如果您使用现成的解决方案,那么即使接受挑战也没有意义。这就像在汽车上骑马拉松一样。
static int migratoryBirds(int[] arr) {
    int max = 1;
    int[] freq = new int[6];

    for (int val : arr)
        freq[val]++;

    for (int i = 2; i < freq.length; i++)
        max = freq[i] > freq[max] ? i : max;

    return max;
}
static int migratoryBirds(List<Integer> arr) {
    int freq[]=new int[6];
    for(int i=0;i<arr.size();i++){
        ++freq[arr.get(i)];
    }
    int maxAt = 1;
    for (int i = 2; i < freq.length; i++) {
        if (freq[i] > freq[maxAt]) {
            maxAt = i;
        }
    }
    return maxAt;
}
static int migratoryBirds(int[] arr) {
    int highestFrequency = 0;
    int highestFrequencyBirdType = 0;
    int[] frequencies = new int[5]; // there are 5 bird types

    for (int birdType : arr) {
        int frequency = ++frequencies[birdType - 1];
        if (frequency > highestFrequency) {
            highestFrequency = frequency;
            highestFrequencyBirdType = birdType;
        } else if (frequency == highestFrequency && birdType < highestFrequencyBirdType) {
            highestFrequencyBirdType = birdType;
        }
    }

    return highestFrequencyBirdType;
}