Java 有没有更快的方法找到int[]的最高对和?

Java 有没有更快的方法找到int[]的最高对和?,java,arrays,algorithm,sum,Java,Arrays,Algorithm,Sum,有没有一种不同的方式使用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>

有没有一种不同的方式使用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));
}
import java.util.*;
班长{
公共静态int GetHighestPairSum(int[]L)
{
int最大=L[0];
int指数=0;
int第二大=L[0];
ArrayList I=新的ArrayList();

对于(inti=0;i,在这个实现中,您必须检查列表两次。 一种更有效的方法是为最大和第二大元素保留两个变量,并在执行过程中对它们进行更新。请注意,这可以通过直接迭代数组来完成,而无需将其复制到
ArrayList
,正如@GBlodgett的回答所示

可以支持任意数量元素的类似解决方案可以使用[
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(); 
}
public static int gethighestuplesum(int[]arr,int n){
PriorityQueue pq=新的PriorityQueue(arr.length);
用于(int i:arr){
如果(pq.size()
为什么不直接在
数组中循环,为最大值和第二大值设置一个变量,而不是将其复制到
列表中,循环一次以找到最大值,将其删除,然后调用
集合。max
?@GBlodgett您能发布一些代码吗?
解决方案可能更可读:
Arrays.stream(L).sorted().skip(L.length-2).sum();
。然而,这种方法的时间复杂度是
O(n logn)
,而
O(n)
解决方案是简单的,只有一个for循环和两个指针。这里已经回答了可能的重复