public class Solution {
public int arrayPairSum(int[] nums) {
Arrays.sort(nums);
int result = 0;
for (int i = 0; i < nums.length; i += 2) {
result += nums[i];
}
return result;
}
}
算法证明:
- 假设在任意一对
i
中,bi >= ai
- 标记
Sm = min(a1, b1) + min(a2, b2) + ... + min(an, bn)
,当Sm
最大时即为本题的解。根据1
规则,Sm = a1 + a2 + ... + an
- 标记
Sa = a1 + b1 + a2 + b2 + ... + an + bn
,Sa
是根据所给输入的一个常数。 - 标记
di = |ai - bi|
,根据1
规则,di = bi - ai
。标记Sd = d1 + d2 + ... + dn
- 因此
Sa = a1 + a1 + d1 + a2 + a2 + d2 + ... + an + an + dn = 2Sm + Sd
就可以转换为Sm = (Sa - Sd) / 2
,若想使得Sm
最大,且Sa
是一个常数。我们需要让Sd
为最小。 - 所以这个问题就转化成为寻找数据对使得
di
的和最小。显然相邻元素之间的di
最小。