说明
给定一个由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)的算法,任何人都可以给我一些指示吗?
答案 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
不断重复这个,直到你得到总和或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);