【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
题解
- 排序:首先对数组 nums 进行排序。由于数组已经包含了从 1 到 2n 的所有整数,排序后数组将按升序排列。
- 计算总和:对排序后的数组进行遍历,每次跳过两个索引(即 i = i + 2),这样可以确保我们总是取每对中较小的数。将这些较小的数累加到 sum 变量中。
- 返回结果:返回计算出的 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),除了输入数组外,我们只使用了常数个额外变量。
这个算法的优势在于它简单且高效,只需要一次排序和一次遍历即可找到所有对的和的最小总和。