561. Array Partition I【easy】

Given an array of 2n integers, your task is to group these integers into n pairs of integer, say (a1, b1), (a2, b2), ..., (an, bn) which makes sum of min(ai, bi) for all i from 1 to n as large as possible.

Example 1:

Input: [1,4,3,2]

Output: 4
Explanation: n is 2, and the maximum sum of pairs is 4 = min(1, 2) + min(3, 4).

Note:

  1. n is a positive integer, which is in the range of [1, 10000].
  2. All the integers in the array will be in the range of [-10000, 10000].

解法一:

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

为了不浪费元素,先排序,这样可以保证min加出来为max

比如[1, 9, 2, 4, 6, 8]

如果按顺序来的话,1和9就取1,2和4就取2,6和8就取6,显而易见并不是最大,原因就是9在和1比较的时候被浪费了,9一旦浪费就把8也给影响了,所以要先排序

@shawngao 引入了数学证明的方法,如下:

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.

最新文章

  1. IE 浏览器各个版本 JavaScript 支持情况一览表
  2. javascript:window.history.go(-1)
  3. getaddrinfo
  4. js模拟表单提交
  5. (六)6.7 Neurons Networks whitening
  6. ANDROID_MARS学习笔记_S05_004_过滤杂质,得到真正的加速度
  7. sift算法c语言实现
  8. synchronized和进程间通信(转)
  9. WebService小记
  10. KMP算法 --- 在文本中寻找目标字符串
  11. 【VMware Workstation】虚拟机静态IP NAT连接外部网络(局域网以及广域网)
  12. 在Django中使用Neo4j
  13. Confluence 6 针对 &#39;unmigrated-wiki-markup&#39; 宏重新尝试合并
  14. STM32应用实例十四:利用光敏二极管实现光度测量
  15. jQuery中empty与html(&quot;&quot;)的区别对比
  16. hdu5646数学构造+二分
  17. jQuery应用一之验证插件validate的使用
  18. PREV-5_蓝桥杯_错误票据
  19. TextView 设置部分文字颜色及点击事件SpannableString
  20. 解决Oracle11g空表无法导出的问题

热门文章

  1. [Codeforces 10E] Greedy Change
  2. 【可持久化Trie】bzoj3261 最大异或和
  3. 【费马小定理+矩阵快速幂】HDU4549——M斐波那契数列
  4. 微服务之SpringCloud实战(五):SpringCloud Eureka详解
  5. 将SeqReader打包成可执行的jar包
  6. Mac SublimeREPL 插件安装使用及解决各种坑
  7. Delphi Thread
  8. go/golang init()方法的调用
  9. 写一个函数判断字符串中&quot;{&quot;与&quot;}&quot;,&quot;[&quot;与&quot;]&quot;,&quot;(&quot;与&quot;)&quot;匹配,&quot;{&quot;必须在&quot;}&quot;前面,&quot;[&quot;必须在&quot;]&quot;前面,&quot;(&quot;必须在&quot;)&quot;前面,可以嵌套
  10. Bat 获取本地代码的Svn Revision并保存到变量