一个数对 (a,b)
的 数对和 等于 a + b
。最大数对和 是一个数对数组中最大的 数对和 。
- 比方说,如果我们有数对
(1,5)
,(2,3)
和(4,4)
,最大数对和 为max(1+5, 2+3, 4+4) = max(6, 5, 8) = 8
。
给你一个长度为 偶数 n
的数组 nums
,请你将 nums
中的元素分成 n / 2
个数对,使得:
nums
中每个元素 恰好 在 一个 数对中,且- 最大数对和 的值 最小 。
请你在最优数对划分的方案下,返回最小的 最大数对和 。
示例 1:
输入:nums = [3,5,2,3] 输出:7 解释:数组中的元素可以分为数对 (3,3) 和 (5,2) 。 最大数对和为 max(3+3, 5+2) = max(6, 7) = 7 。
示例 2:
输入:nums = [3,5,4,2,4,6] 输出:8 解释:数组中的元素可以分为数对 (3,5),(4,4) 和 (6,2) 。 最大数对和为 max(3+5, 4+4, 6+2) = max(8, 8, 8) = 8 。
贪心算法
/**
* 贪心算法
*
* @param nums
* @return
*/
public static int minPairSum(int[] nums) {
if (nums == null || nums.length == 0) return 0;
int len = nums.length;
// 排序后,分别以第i个和len-i-1个为一组,其中组和最大的即为所求目标值
Arrays.sort(nums);
int res = nums[0];
for (int i = 0; i < len / 2; i++) {
res = Math.max(res, nums[i] + nums[len - i - 1]);
}
return res;
}
测试用例
public static void main(String[] args) {
int[] nums = new int[]{3, 5, 2, 3};
int minPainSum = MinPairSum.minPairSum(nums);
System.out.println("MinPairSum demo01 result : " + minPainSum);
nums = new int[]{3, 5, 4, 2, 4, 6};
minPainSum = MinPairSum.minPairSum(nums);
System.out.println("MinPairSum demo01 result : " + minPainSum);
}