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

时间:2019-05-26 15:42:07

标签: 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> 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));
}

}

2 个答案:

答案 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(); 
}