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;
}