j
jaryue
V1
2023/04/27阅读:15主题:默认主题
leetcode 561. 数组拆分
leetcode 561. 数组拆分
题目描述
-
数组拆分
给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从 1 到 n 的 min(ai, bi) 总和最大。
返回该 最大总和 。
示例 1:
输入:nums = [1,4,3,2] 输出:4 解释:所有可能的分法(忽略元素顺序)为:
-
(1, 4), (2, 3) -> min(1, 4) + min(2, 3) = 1 + 2 = 3 -
(1, 3), (2, 4) -> min(1, 3) + min(2, 4) = 1 + 2 = 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 <= n <= 104 nums.length == 2 * n -104 <= nums[i] <= 104
解题思路
法1
方法1
排序\
将数字分成n组,计算每组最小的值的和,和最大时既是我们最终的返回值,
所以我们要得到最大的和值,就可以先排序
然后依次加0,2,4...2n-2位置的数就是最大的和值
-
时间复杂度(O(nlogn)) -
空间复杂度(O(1))
执行结果
法1
// 最大分组
func arrayPairSum(nums []int) (r int) {
sort.Ints(nums)
for i := 0; i < len(nums); i += 2 {
r += nums[i]
}
return
}
执行结果: 通过 显示详情 查看示例代码 添加备注
执行用时: 52 ms , 在所有 Go 提交中击败了 75.95% 的用户 内存消耗: 6.4 MB , 在所有 Go 提交中击败了 67.09% 的用户 通过测试用例: 83 / 83 炫耀一下:
作者介绍
j
jaryue
V1