您的位置:首页 > 其它

561. Array Partition I

2017-11-30 19:20 417 查看
原题链接

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
最小。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: