leetcode 1877. 数组中最大数对和的最小值
一、题目
1.题目描述
一个数对
(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
2.基础框架
C++基础框架代码如下:
int minPairSum(vector<int>& nums){
}
3.解题思路
- 题目分析
- 题目目标是返回最小的最大数对和。。
- 数据量为
10^5
,说明可以使用的算法时间复杂度最大为O(nlogn)
。 - 这道题使用到贪心的思想,只要将数组中最大值与最小值进行相加,得到的数对和的情况,一定是比大于最小值的其他元素值与最大值相加的数对和更小。换句话来说,如何削掉最大值的锋芒,那就是给它一个猪队友(最小值),这比给其他元素和它组队更能削去它的锋芒,因为最小值已经是坑友力极限了。
- 所以得到的解题思路,就是将数组进行排序,数组左右两端使用双指针,将两端的值相加,每次相加后在将相加后的数对和与当前最大数对和进行比较。
-
实现代码:
int minPairSum(vector<int>& nums) { int n = nums.size(); sort(nums.begin(), nums.end()); int ans = 0; for (int i = 0, j = n - 1; i < j; ++i, --j) ans = max(nums[i] + nums[j], ans); return ans; }
-
复杂度分析
时间复杂度:O(nlogn)
空间复杂度:O(1)
4.知识点
贪心思想、双指针、排序