如何在大小为n的正整数数组中找到最大的对,但是整数至少在距离k处? (例如,如果第一个元素是[i],那么第二个元素应该是[i + k](或更多)。)
我试过了:
int max_sum = 0;
int sum;
for (int i = 0 ; i < n; i++) {
for( int j = i + k; j < n; j++) {
sum = arr_sums[i] + arr_sums[j];
if ( sum > max_sum ) {
max_sum = sum;
}
}
}
但是对于大型阵列来说它太慢了。
答案 0 :(得分:10)
在O(n)中非常简单,而不是像你的解决方案那样做O(n²)。
For each j, 0 ≤ j < n,
calculate m [j] = "largest element from a [j] to a [n - 1]. ".
Obviously m [n - 1] = a [n - 1], m [j] = max (a [j], m [j + 1]).
Then for each i, 0 ≤ i < n - k, calculate a [i] + m [i + k],
and pick the largest of these.
如果没有实际存储除{1}之外的值m [j]
,应该明白如何做到这一点。
答案 1 :(得分:4)
//assuming we checked first for n<=k
int max_lagged = arr_sums[0];
int max_sum = max_lagged+arr_sums[k];
int sum;
for (int i = k+1 ; i < n; i++) {
if (arr_sums[i-k] > max_lagged) {
max_lagged=arr_sums[i-k];
}
sum = arr_sums[i] + max_lagged;
if ( sum > max_sum ) {
max_sum = sum;
}
}