在整数数组中找到最大的对

时间:2016-03-09 17:11:56

标签: c arrays algorithm performance

如何在大小为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;

        }
    }
}

但是对于大型阵列来说它太慢了。

2 个答案:

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