力扣每日一题21.07.20

数组中最大数对和的最小值

题目描述:

一个数对(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;
    }
};

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值