使用java集合是否有其他方法可以使此代码更快?还有其他方法可以使此代码更快吗? ArrayList是解决此类问题的正确选择吗?
import java.util.*;
class Main{
public static int GetHighestPairSum(int[] L)
{
int largest = L[0];
int index = 0;
int secondlargest = L[0];
ArrayList<Integer> I = new ArrayList<Integer>();
for (int i = 0; i<L.length; i++)
{
I.add(L[i]);
if (i == 0)
{
largest = L[i];
}
else
{
if (largest < L[i])
{
largest = L[i];
index = i;
}
}
}
I.remove(index);
secondlargest = Collections.max(I);
return largest + secondlargest;
}
public static void main(String[] args) {
int[] testarr = new int[] {1,2,3,23,67,100,2,11,3,2,6,7,1,13,4,7,9,34,7,3,2,1,100};
System.out.println(GetHighestPairSum(testarr));
}
}
答案 0 :(得分:0)
如果这样做的话,您可以将所有内容保持在一个循环中
public static int GetHighestPairSum(int[] arr) {
int big = arr[0];
int sBig = arr[1];
for(int i = 1; i < arr.length; i++) {
if(arr[i] > big) {
sBig = big;
big = arr[i];
}else if(arr[i] > sBig) {
sBig = arr[i];
}
}
return big + sBig;
}
这也将消除对List
的需求,并将删除对Collections.max
的呼叫
答案 1 :(得分:0)
使用此实现,您将不得不两次遍历该列表。
一种性能更高的方法是为最大和第二大元素保留两个变量,并随需更新它们。请注意,这可以通过直接迭代数组来完成,而无需像@GBlodgett的答案所建议的那样将其复制到ArrayList
。
可以支持任意数量元素的类似解决方案可以使用[PriorityQueue
]:
public static int getHighestTuppleSum(int[] arr, int n) {
PriorityQueue<Integer> pq = new PriorityQueue(arr.length);
for (int i : arr) {
if (pq.size() < n) {
pq.add(i);
}
if (pq.peek() < i) {
pq.poll();
pq.add(i);
}
}
return pq.stream().mapToInt(Integer::intValue).sum();
}