【C++刷题】力扣-#561-数组拆分

题目描述

给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), …, (an,
bn) ,使得从 1 到 n 的 min(ai, bi) 总和最大。
返回该最大总和 。

示例

示例 1

输入:nums = [1,4,3,2]
输出:4
解释:所有可能的分法(忽略元素顺序)为:
1. (1, 4), (2, 3) -> min(1, 4) + min(2, 3) = 1 + 2 = 3
2. (1, 3), (2, 4) -> min(1, 3) + min(2, 4) = 1 + 2 = 3
3. (1, 2), (3, 4) -> min(1, 2) + min(3, 4) = 1 + 3 = 4
所以最大总和为 4

示例 2

输入:nums = [6,2,6,5,1,2]
输出:9
解释:最优的分法为 (2, 1), (2, 5), (6, 6). min(2, 1) + min(2, 5) + min(6, 6) = 1 + 2 + 6 = 9

题解

  1. 排序:首先对数组 nums 进行排序。由于数组已经包含了从 1 到 2n 的所有整数,排序后数组将按升序排列。
  2. 计算总和:对排序后的数组进行遍历,每次跳过两个索引(即 i = i + 2),这样可以确保我们总是取每对中较小的数。将这些较小的数累加到 sum 变量中。
  3. 返回结果:返回计算出的 sum 值,即为所有对的和的最小总和。

代码实现

int arrayPairSum(vector<int>& nums) {
    sort(nums.begin(), nums.end());
    int sum = 0;
    for (int i = 0; i < nums.size(); i = i + 2) {
        sum += nums[i];
    }
    return sum;
}

复杂度分析

● 时间复杂度:O(n log n),其中 n 是数组 nums 的长度。主要时间消耗在排序上。
● 空间复杂度:O(1),除了输入数组外,我们只使用了常数个额外变量。
这个算法的优势在于它简单且高效,只需要一次排序和一次遍历即可找到所有对的和的最小总和。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值