561.数组拆分

  1. 561.数组拆分
    1. 561.1 题目
    2. 561.2 题解
      1. 排序后取偶数索引的和
    3. 561.3 代码
    4. 561.4 运行结果

561.数组拆分


561.1 题目

给定长度为 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 <= n <= 10^4
  • nums.length == 2 * n
  • -10^4 <= nums[i] <= 10^4

561.2 题解

排序后取偶数索引的和

// 方法一:排序后取偶数索引的和
static int ArrayPairSum1(int[] nums)
{
    // 先将数组排序
    Array.Sort(nums);

    // 将排序后的数组中每隔一个元素的值相加即可
    int sum = 0;
    for (int i = 0; i < nums.Length; i += 2)
    {
        sum += nums[i];
    }

    return sum;
}

561.3 代码

using System;
using System.Linq;

class Program
{
    static void Main()
    {
        #region 题目

        // 给定长度为 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 <= n <= 104
        // nums.length == 2 * n
        // -104 <= nums[i] <= 104

        #endregion

        #region 测试

        // 示例 1
        int[] nums1 = { 1, 4, 3, 2 };
        int result1_1 = ArrayPairSum1(nums1);
        Console.WriteLine($"示例1 方法1 输出:{result1_1}");

        // 示例 2
        int[] nums2 = { 6, 2, 6, 5, 1, 2 };
        int result2_1 = ArrayPairSum1(nums2);
        Console.WriteLine($"示例2 方法1 输出:{result2_1}");

        #endregion
    }

    #region 答案

    // 方法一:排序后取偶数索引的和
    static int ArrayPairSum1(int[] nums)
    {
        // 先将数组排序
        Array.Sort(nums);

        // 将排序后的数组中每隔一个元素的值相加即可
        int sum = 0;
        for (int i = 0; i < nums.Length; i += 2)
        {
            sum += nums[i];
        }

        return sum;
    }

    #endregion
}

561.4 运行结果

示例1 方法1 输出:4
示例2 方法1 输出:9


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏