算法1877. 数组中最大数对和的最小值(多语言实现)
Posted 二当家的白帽子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法1877. 数组中最大数对和的最小值(多语言实现)相关的知识,希望对你有一定的参考价值。
文章目录
- 1877. 数组中最大数对和的最小值:
- 样例 1:
- 样例 2:
- 提示:
- 分析
- 题解
- 原题传送门:https://leetcode.cn/problems/minimize-maximum-pair-sum-in-array/
1877. 数组中最大数对和的最小值:
一个数对 (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 <= 1 0 5 10^5 105
- n 是 偶数 。
- 1 <= nums[i] <= 1 0 5 10^5 105
分析
- 面对这道算法题目,二当家的陷入了沉思。
- 不管怎么分组,数字之和不会变,数对的数量不会变,那么数对的平均值不会变,最大数对和的最小值一定不会小于这个平均值。
- 当调小其中一组,另外一组一定增大。所以最好的办法就是尽可能让每一个数对的和都靠近平均数对和,也就是每个数对和尽量想等。
- 排序后,最大的数字和最小的数字组成数对,第二大的数字和第二小的数字组成对,以此类推,这就是答案。
题解
java
class Solution
public int minPairSum(int[] nums)
int ans = 0;
int n = nums.length;
Arrays.sort(nums);
for (int i = 0; i < n / 2; ++i)
ans = Math.max(ans, nums[i] + nums[n - 1 - i]);
return ans;
c
int cmp(int *a, int *b)
return *a - *b;
int minPairSum(int* nums, int numsSize)
int ans = 0;
qsort(nums, numsSize, sizeof(int), cmp);
for (int i = 0; i < numsSize / 2; ++i)
ans = fmax(ans, nums[i] + nums[numsSize - 1 - i]);
return ans;
c++
class Solution
public:
int minPairSum(vector<int>& nums)
int ans = 0;
int n = nums.size();
sort(nums.begin(), nums.end());
for (int i = 0; i < n / 2; ++i)
ans = max(ans, nums[i] + nums[n - 1 - i]);
return ans;
;
python
class Solution:
def minPairSum(self, nums: List[int]) -> int:
ans = 0
n = len(nums)
nums.sort()
for i in range(n // 2):
ans = max(ans, nums[i] + nums[n-1-i])
return ans
go
func minPairSum(nums []int) int
var max = func(a, b int) int
if a > b
return a
return b
ans := 0
n := len(nums)
sort.Ints(nums)
for i, val := range nums[:n/2]
ans = max(ans, val+nums[n-1-i])
return ans
rust
impl Solution
pub fn min_pair_sum(mut nums: Vec<i32>) -> i32
let mut ans: i32 = 0;
let n = nums.len();
nums.sort();
for i in 0..n
ans = ans.max(nums[i]+nums[n-1-i]);
ans
typescript
function minPairSum(nums: number[]): number
let ans = 0;
const n = nums.length;
nums.sort((a, b) => a - b);
for (let i = 0; i < Math.floor(n / 2); i++)
ans = Math.max(ans, nums[i] + nums[n - 1 - i]);
return ans;
;
原题传送门:https://leetcode.cn/problems/minimize-maximum-pair-sum-in-array/
非常感谢你阅读本文~
欢迎【👍点赞】【⭐收藏】【📝评论】~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://le-yi.blog.csdn.net/ 博客原创~
以上是关于算法1877. 数组中最大数对和的最小值(多语言实现)的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 1877. 数组中最大数对和的最小值/剑指 Offer 52. 两个链表的第一个公共节点/146. LRU 缓存机制