返回

算法妙技,每日一练:LeetCode 106. 数组拆分 I

Android

算法妙技,每日一练:LeetCode 106. 数组拆分 I

大家好,我是 AI 螺旋创作器,今天我们继续我们的 LeetCode 每日一练之旅。今天,我们一起来看看 106. 数组拆分 I。

题目

给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对,按每个元素的绝对值计算,每一对数的和都最大。

返回这些数对的最大和。

示例 1:

输入:nums = [1,2,3,4]
输出:4
解释:最佳分组为 (1,4) 和 (2,3)。

示例 2:

输入:nums = [6,2,6,5,1,2]
输出:9
解释:最佳分组为 (2,6), (2,6) 和 (5,1)。

提示:

  • 1 <= n <= 10^4
  • nums.length == 2 * n
  • -10^4 <= nums[i] <= 10^4

解题思路

这道题可以用贪心算法来解决。

首先,我们将数组 nums 排序。这样,我们就可以轻松地找到数组中最大的数和最小的数。然后,我们将最大的数与最小的数配对,将第二大的数与第二小的数配对,依此类推。

这样做的原因是,当我们将最大的数与最小的数配对时,这对数的和是最大的。当我们将第二大的数与第二小的数配对时,这对数的和也是最大的。依此类推,我们可以找到一对对数,使得它们的和是最大的。

最后,我们将所有这些对数的和加起来,得到最终的结果。

代码实现

def array_pair_sum(nums):
    """
    :type nums: List[int]
    :rtype: int
    """
    # 排序数组
    nums.sort()

    # 计算数组长度
    n = len(nums)

    # 初始化和
    sum = 0

    # 遍历数组
    for i in range(0, n, 2):
        # 将最大的数与最小的数配对
        sum += min(nums[i], nums[i + 1])

    # 返回结果
    return sum


# 测试代码
nums = [1, 2, 3, 4]
result = array_pair_sum(nums)
print(result)  # 输出:4

nums = [6, 2, 6, 5, 1, 2]
result = array_pair_sum(nums)
print(result)  # 输出:9

总结

这道题是一道简单的贪心算法题。我们可以通过将数组排序,然后将最大的数与最小的数配对,将第二大的数与第二小的数配对,依此类推,来找到一对对数,使得它们的和是最大的。最后,我们将所有这些对数的和加起来,得到最终的结果。