前言
本文记录LeetCode - 561. 数组分片 I(Array Partition I)问题。
问题描述
给出一个含有2n个整型数的数组,你的任务是,将这些数分为n组,形如:(a1,b1),(a2,b2),…(an,bn),使得下式的值取到最大,并输出这个最大值。
S=n∑i=1min(ai,bi)示例:
Input: [1,4,3,2]
Output: 4
解释说明:
分组:n=2
最大值:S=4=min(1,2)+min(3,4)
注意:
- n是一个正整数,取值范围:[1,10000]
- 数组中所有整数的取值范围:[−10000,10000]
问题解法
显然,我们没有办法对一个乱序的数组进行排列组合,使得其每组最小值相加后得到的数值最大。我们首先要对数组进行排序操作(升序降序均可)。排序后,分组规则就简单明了,每两个数分一组,遍历求和后得到的数值,一定是最大的。
/* STL 头文件 */
#include <algorithm>
/* `MIN()`宏函数 */
#define MIN(x, y) \
((x) < (y) ? (x) : (y))
class Solution {
public:
int arrayPairSum(vector<int>& nums) {
/* 对数组进行排序 */
sort(nums.begin(), nums.end());
int sum = 0;
/* 隔二分组 */
for(int i = 0; i < nums.size(); i += 2) {
/* 遍历求和 */
sum += MIN(nums[i], nums[i + 1]);
}
return sum;
}
};
代码清单:
C++
实现
import java.util.*;
class Solution {
public int arrayPairSum(int[] nums) {
Arrays.sort(nums);
int sum = 0;
for(int i = 0; i < nums.length; i += 2) {
sum += this.min(nums[i], nums[i + 1]);
}
return sum;
}
private int min(int x, int y) {
return x < y ? x : y;
}
}
代码清单:
Java
实现
而使用Python
,一行代码即可完成。Python
语言的表现力还是极强的。
class Solution:
def arrayPairSum(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
return sum(sorted(nums)[::2])
代码清单:
Python
实现