数组中最大数对和的最小值
题目描述:
一个数对(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。
提示:
- n == nums.length
- 2 <= n <= 10^5
- n是偶数
- 1 <= nums[i] <= 10^5
思路:排序+双指针
针对示例,经过观察,所有的最大数对和的最小值应由左右两侧同时对排序数组取数组成数对,求和后的最大值。以示例1为例,排序后的nums = [2, 3, 3, 5],它的最大数对和应为7,即首尾相加,所以使用双指针。
python代码:
class Solution:
def minPairSum(self, nums: List[int]) -> int:
nums.sort()
left, right = 0, len(nums)-1
sum = []
while right > left:
sum.append(nums[left] + nums[right])
left += 1
right -= 1
return max(sum)
java代码:
class Solution {
public int minPairSum(int[] nums) {
Arrays.sort(nums);
int length = nums.length;
int max = 0;
for (int i = 0, j = length - 1; i < j; i++, j--) {
max = Math.max(nums[i] + nums[j], max);
}
return max;
}
}
C++代码:
class Solution {
public:
int minPairSum(vector<int>& nums) {
sort(nums.begin(), nums.end());
int length = nums.size();
int max_sum = 0;
for (int i=0, j=length-1; i < j; ++i, --j) {
max_sum = max(max_sum, nums[i]+nums[j]);
}
return max_sum;
}
};