LeetCode ** 561. Array Partition I

来源:互联网 发布:自制相册软件下载 编辑:程序博客网 时间:2024/06/05 18:16



这个题目意思是把一个2N大小的数组分成N个组,每个组两个数,然后把N个组中小的那个数累加,得到的累加和最大的既为本题的解。

在solution中,本题提供了一个很棒的回答。


Let me try to prove the algorithm...

  1. Assume in each pair ibi >= ai.
  2. Denote Sm = min(a1, b1) + min(a2, b2) + ... + min(an, bn). The biggest Sm is the answer of this problem. Given 1Sm = a1 + a2 + ... + an.
  3. Denote Sa = a1 + b1 + a2 + b2 + ... + an + bnSa is constant for a given input.
  4. Denote di = |ai - bi|. Given 1di = bi - ai. Denote Sd = d1 + d2 + ... + dn.
  5. So Sa = a1 + a1 + d1 + a2 + a2 + d2 + ... + an + an + di = 2Sm + Sd => Sm = (Sa - Sd) / 2. To get the max Sm, given Sa is constant, we need to make Sd as small as possible.
  6. So this problem becomes finding pairs in an array that makes sum of di (distance between ai and bi) as small as possible. Apparently, sum of these distances of adjacent elements is the smallest. If that's not intuitive enough, see attached picture. Case 1 has the smallest Sd.


class Solution {public:    int arrayPairSum(vector<int>& nums) {    sort(nums.begin(), nums.end());    int sum = 0;    for (int i = 0; i < nums.size(); sum += nums[i], i += 2);    return sum;  }};


原创粉丝点击