class Solution {
public:
int arrayPairSum(vector<int>& nums) {
int maxSum=0;
sort(nums.begin(),nums.end());
for(int i=0; i<nums.size()-1; i++){
if(i%2==0)
maxSum += nums[i];
}
return maxSum;
}
};
My Solution
马鸭!是真滴没想出来思路!百度到了解决办法(先排序然后把奇数位置的加起来),然后coding实现了>o<...
总之就是想得到最大的sum,就要保证所有abs(pairA-pairB)的加和最小,想到sort后相邻位置的两个数差值最小~
- 假设对于每一对i,bi >= ai。
- 定义Sm = min(a1,b1)+ min(a2,b2)+ … + min(an,bn)。最大的Sm是这个问题的答案。由于bi >= ai,Sm = a1 + a2 + … + an。
- 定义Sa = a1 + b1 + a2 + b2 + … + an + bn。对于给定的输入,Sa是常数。
- 定义di = | ai - bi |。由于bi >= ai,di = bi-ai, bi = ai+di。
- 定义Sd = d1 + d2 + … + dn。
- 所以Sa = a1 + (a1 + d1) + a2 + (a2 + d2) + … + an + (an + di) = 2Sm + Sd , 所以Sm =(Sa-Sd)/ 2。为得到最大Sm,给定Sa为常数,需要使Sd尽可能小。
- 所以这个问题就是在数组中找到使di(ai和bi之间的距离)的和尽可能小的对。显然,相邻元素的这些距离之和是最小的。
Best Solution
看不懂。。。。