[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

看不懂。。。。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值