leetcode 1877. 数组中最大数对和的最小值

leetcode 1877. 数组中最大数对和的最小值

一、题目

原题链接: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.解题思路

  • 题目分析
  1. 题目目标是返回最小最大数对和。。
  2. 数据量为10^5,说明可以使用的算法时间复杂度最大为O(nlogn)
  3. 这道题使用到贪心的思想,只要将数组中最大值与最小值进行相加,得到的数对和的情况,一定是比大于最小值的其他元素值与最大值相加的数对和更小。换句话来说,如何削掉最大值的锋芒,那就是给它一个猪队友(最小值),这比给其他元素和它组队更能削去它的锋芒,因为最小值已经是坑友力极限了。
  4. 所以得到的解题思路,就是将数组进行排序,数组左右两端使用双指针,将两端的值相加,每次相加后在将相加后的数对和与当前最大数对和进行比较。
  • 实现代码:

    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.知识点

​  贪心思想、双指针、排序

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值