给定整数数组A,返回两个元素之间的最大可能和距离。对于i>,和距离被定义为A[i] + A[j] + (i - j)
。 Ĵ
例如A = [8, 2, 4, 9, 5, 8, 0, 3, 8, 2]
使用i = 0和j = 8
O( n 2 )解决方案是微不足道的。是否有任何O( n )解决方案(其中 n 是数组的长度)?
答案 0 :(得分:10)
对于每个索引i,我们只需要知道一个index
最大化总和A[i] + A[index] + (i - index) = A[i] + i + (A[index] - index)
。这意味着,我们只需要保留index
,A[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)
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;