[561]Array Partition I

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后相邻位置的两个数差值最小~

  1. 假设对于每一对i,bi >= ai。
  2. 定义Sm = min(a1,b1)+ min(a2,b2)+ … + min(an,bn)。最大的Sm是这个问题的答案。由于bi >= ai,Sm = a1 + a2 + … + an。
  3. 定义Sa = a1 + b1 + a2 + b2 + … + an + bn。对于给定的输入,Sa是常数。
  4. 定义di = | ai - bi |。由于bi >= ai,di = bi-ai, bi = ai+di。
  5. 定义Sd = d1 + d2 + … + dn。
  6. 所以Sa = a1 + (a1 + d1) + a2 + (a2 + d2) + … + an + (an + di) = 2Sm + Sd , 所以Sm =(Sa-Sd)/ 2。为得到最大Sm,给定Sa为常数,需要使Sd尽可能小。
  7. 所以这个问题就是在数组中找到使di(ai和bi之间的距离)的和尽可能小的对。显然,相邻元素的这些距离之和是最小的。

Best Solution

看不懂。。。。

发布了16 篇原创文章 · 获赞 0 · 访问量 3131

猜你喜欢

转载自blog.csdn.net/Calliope1997/article/details/82875472