1. 题目来源
2. 题目解析
比较好猜的贪心,最大和最小作为数对,一定和最小。
证明:
- 贪心方式: 从小到大排序,首尾组合作为数对。
- 反证法,如果一个最优解不是首尾组合的,设为
(a, d),(b, c),大小关系为a<=b<=d<=c,则a+d<=b+c,则数对最大值由b+c提供。如果替换成(a, c),(b,d),数对最大值b+d<=b+c,就变小了。 - 就一句话,一定可以调整成贪心解,并答案不会变差。
时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
空间复杂度: O ( 1 ) O(1) O(1)
代码:
二分, O ( n l o g n ) O(nlogn) O(nlogn),比较容易分析。
class Solution {
public:
int minPairSum(vector<int>& nums) {
sort(nums.begin(), nums.end());
int n = nums.size();
int res = -1e9;
for (int i = 0; i < n / 2; i ++ ) {
res = max(res, nums[i] + nums[n - 1 - i]);
}
return res;
}
};
本文介绍了一种使用贪心算法求解数组中最大数对和的最小值的方法。通过将数组排序,选取最小和最大的元素作为数对,证明这种策略的最优性。代码实现采用二分法,时间复杂度为O(nlogn),空间复杂度为O(1)。
400

被折叠的 条评论
为什么被折叠?



