最大化整数数组的和距离

时间:2015-08-18 08:37:22

标签: algorithm

给定整数数组A,返回两个元素之间的最大可能和距离。对于i>,和距离被定义为A[i] + A[j] + (i - j)。 Ĵ

例如A = [8, 2, 4, 9, 5, 8, 0, 3, 8, 2]使用i = 0和j = 8

实现最大和距离为24

O( n 2 )解决方案是微不足道的。是否有任何O( n )解决方案(其中 n 是数组的长度)?

4 个答案:

答案 0 :(得分:10)

对于每个索引i,我们只需要知道一个index最大化总和A[i] + A[index] + (i - index) = A[i] + i + (A[index] - index)。这意味着,我们只需要保留indexA[index] - index最大。

int index = 0;
int result = 0;

for(int i = 1; i < n; i++){
    int total = A[i] + i + A[index] - index;
    result = max(result, total);
    if(A[i] - i > A[index] - index){
        index = i;
    }
}
return result;

答案 1 :(得分:7)

这是可能的:

  • 创建一个数组并用A [i] + i填充每个

  • 创建另一个数组并用A [j] -j填充每个j

  • 获取最高I [maxI]和J [maxJ]

  • 的索引
  • 返回A [maxI] + A [maxJ] + maxI - maxJ

你去,O(n)!

答案 2 :(得分:5)

很好的解决...... Pham ......谢谢。 更可读的解决方案可能是......

    int sumP = Integer.MIN_VALUE;
    int sumQ = Integer.MIN_VALUE;
    for(int i = 0; i < A.length; i++){
        sumP = Math.max(A[i] - i, sumP);
        sumQ = Math.max(A[i] + i, sumQ);
    }
    return sumP + sumQ;

答案 3 :(得分:1)

这是通过100%测试的最准确的解决方法。“

var sumP = MIN_VALUE*2;
var sumQ = MIN_VALUE*2;
for(var i = 0; i < A.length; i++){
    sumP = Math.max(A[i] - i, sumP);
    sumQ = Math.max(A[i] + i, sumQ);
}
return sumP + sumQ;