描述:
给定一个由 n 个正整数组成的数组,找到使 C=A+B 的最大 C。A,B,C 都在给定的数组中。
例子:
1 1 1 4 5 5 6 6 10 9 C=10
1 3 6 C=-1,表示最大的C不存在
我正在寻找一种小于 O(n^3) 的算法,谁能给我一些指导?
描述:
给定一个由 n 个正整数组成的数组,找到使 C=A+B 的最大 C。A,B,C 都在给定的数组中。
例子:
1 1 1 4 5 5 6 6 10 9 C=10
1 3 6 C=-1,表示最大的C不存在
我正在寻找一种小于 O(n^3) 的算法,谁能给我一些指导?
对列表进行排序。从最大到最小迭代 C,从最小到 C 的值迭代 B。到目前为止,它是 O(n^2)。对于每个 (C, B) 对,计算 A,您只需要查找它是否在数组中。您可以对 O(n^2 log n) 的总时间使用二进制搜索。
O(n^2) 基于@valtron 的算法就足够了
更高效的解决方案:
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);