题目链接:https://leetcode.cn/problems/array-partition/solutions/
题目描述
给定长度为2n
的整数数组nums
,你的任务是将这些数分成n
对, 例如(a1, b1)
, (a2, b2)
, …, (an, bn)
,使得从1 到 n
的 min(ai, bi)
总和最大。
返回该 最大总和
。
示例 1
输入:nums = [1,4,3,2]
输出:4
解释:所有可能的分法(忽略元素顺序)为:
(1, 4), (2, 3) -> min(1, 4) + min(2, 3) = 1 + 2 = 3
(1, 3), (2, 4) -> min(1, 3) + min(2, 4) = 1 + 2 = 3
(1, 2), (3, 4) -> min(1, 2) + min(3, 4) = 1 + 3 = 4
所以最大总和为 4
示例 2
输入:nums = [6,2,6,5,1,2]
输出:9
解释:最优的分法为 (2, 1), (2, 5), (6, 6).
min(2, 1) + min(2, 5) + min(6, 6) = 1 + 2 + 6 = 9
提示
- 1 <= n <= 104
- nums.length == 2 ^ n
- 104 <= nums[i] <= 104
Code
解法一:数学逻辑
这题我们可以由简入繁,先从[1,2,3,4]开始找规律,根据示例发现有三种排法(其实三种排法就是组合
C
4
2
A
2
2
\frac{C_{4}^{2}}{A_{2}^{2}}
A22C42)
(1, 4), (2, 3) -> min(1, 4) + min(2, 3) = 1 + 2 = 3
(1, 3), (2, 4) -> min(1, 3) + min(2, 4) = 1 + 2 = 3
(1, 2), (3, 4) -> min(1, 2) + min(3, 4) = 1 + 3 = 4
然后再看[1,2,3,4,5,6],有
C
6
2
∗
C
4
2
A
3
3
\frac{C_{6}^{2}*C_{4}^{2}}{A_{3}^{3}}
A33C62∗C42种排法,但是不一一列举了。我们可以发现min(ai,bi)的结果是ai,求和就是
∑
a
i
\sum{a}_{i}
∑ai,我们想要这个结果最大就是要让我们舍去的那个数字bi越靠近ai,这样我们损失的值才是最小的,所以我们可以先将数组升序排序,然后将奇数项之和求出返回即可
class Solution {
public int arrayPairSum(int[] nums) {
Arrays.sort(nums);
int resNum = 0;
for (int i = 0; i < nums.length; i += 2) {
resNum += nums[i];
}
return resNum;
}
}