算法 - 查找最大数字,即数组中两个数字的总和

时间:2013-01-29 03:59:29

标签: algorithm

说明

给定一个由n个正整数组成的数组,找到最大的C,使得C = A + B. A,B,C都在给定的数组中。

示例:

1 1 1 4 5 5 6 6 10 9 C = 10

1 3 6 C = -1,这意味着最大的C不存在

我正在寻找一个小于O(n ^ 3)的算法,任何人都可以给我一些指示吗?

3 个答案:

答案 0 :(得分:7)

对列表进行排序。迭代C从大到小,从B到最小到C的值。到目前为止,它是O(n ^ 2)。对于每个(C,B)对,计算A,您只需要找到它是否在数组中。您可以使用二进制搜索的总时间为O(n ^ 2 log n)。

答案 1 :(得分:0)

O(n ^ 2)足够基于@valtron的算法

答案 2 :(得分:0)

更有效的解决方案:

  

1 1 1 4 5 5 6 6 9 10 10

  • 对数组进行排序
  • 保留3个指针C,B和A.
  • 保持C在最后,A在0指数,B在第1指数。
  • 使用指针A和B遍历数组 直到C并检查A + B = C是否存在。
    如果它存在,那么C就是你的答案。
  • 否则,将C移回并再次遍历,将A保持为0,将B保持在第1个索引。

不断重复这个,直到你得到总和或C达到第一个指数。

以下是完整的解决方案:

int arr[] = new int[]{1,1,1,4,5,5,6,6,10,9};
Arrays.sort(arr);

        int n=arr.length;
        int a,b,c,sum,max=-1;

        for(c=n-1;(c>1)&& (max==-1);c--){       // loop through C
            for(a=0;(a<c-1)&&(max==-1);a++){    // loop through A
                for(b=a+1;b<c;b++){             // loop through B
                    sum=arr[a]+arr[b];
                    if(sum==arr[c]){
                         System.out.println("A: "+arr[a]+" B: "+arr[b]);
                        max=arr[c];
                        break;
                    }
                    if(sum>arr[c]){ // no need to go further
                        break;
                    }
                }
            }
        }

System.out.println(max);