【问题标题】:Find largest pair sum in array of integers在整数数组中找到最大的对和
【发布时间】:2016-06-24 05:10:09
【问题描述】:

如何在大小为 n 的正整数数组中找到最大的对和,但整数至少在距离 k 处? (例如,如果第一个元素是 a[i],那么第二个元素应该是 a[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;

        }
    }
}

但是对于大型数组来说太慢了。

【问题讨论】:

  • 数组排序了吗?
  • int max_sum; --> int max_sum = INT_MIN; 因为你使用了一个未初始化的变量
  • @Mitsos101 边缘案例警报!在一组数字中,两个数字的最大和可能为负数。
  • @Oka 又是我的错,整数总是正数。
  • 那他们为什么不是unsigned

标签: c arrays algorithm performance


【解决方案1】:

在 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. 

在不实际存储值m [j] 的情况下如何做到这一点应该很明显,除了一个。

【讨论】:

    【解决方案2】:
    //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;
        }
    }
    

    【讨论】:

    • 不应该是n>=k吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    • 2015-07-04
    • 1970-01-01
    • 2015-10-30
    • 2016-05-25
    相关资源
    最近更新 更多