当前位置: 面试刷题>> 将数组重新排序以构造最小值 (经典算法题500道)


题目描述

给定一个由非负整数组成的数组 nums,你可以重新排列数组中的元素顺序以构造出一个新的数组,要求新数组满足以下条件:

  • 新数组中的相邻元素之间的差(绝对值)的累加和尽可能小。

换句话说,你需要找到一种元素排序方式,使得相邻元素之间的差的绝对值之和达到最小值。

示例 1:

输入: nums = [1, 3, 2, 2, 5, 2, 3, 7]
输出: [2, 2, 2, 3, 3, 1, 5, 7]
解释: 相邻元素之间的差的绝对值之和为 |2-2| + |2-3| + |3-2| + |2-3| + |3-1| + |1-5| + |5-7| = 0 + 1 + 1 + 1 + 2 + 4 + 2 = 11,
这是所有可能的排序方式中达到的最小值。

示例 2:

输入: nums = [5, 3, 6, 7, 1, 2]
输出: [1, 2, 3, 5, 6, 7]
解释: 相邻元素之间的差的绝对值之和为 |1-2| + |2-3| + |3-5| + |5-6| + |6-7| = 1 + 1 + 2 + 1 + 1 = 6,
这是所有可能的排序方式中达到的最小值。

解题思路

为了使得相邻元素之间的差的绝对值之和最小,一个直观的思路是将数组排序后,采用“交错放置”的策略,即小的数和大的数交替放置(如果数组长度为奇数,则中间的数可以放在任意位置,但通常放在中间以便计算)。这样可以保证相邻元素的差尽可能小。

PHP 示例代码

function minAbsoluteSumDiff(array $nums): array {
    sort($nums); // 对数组进行排序
    $n = count($nums);
    $result = [];
    $left = 0;
    $right = $n - 1;
    
    // 交错放置元素
    for ($i = 0; $i < $n; $i++) {
        if ($i % 2 == 0) {
            $result[] = $nums[$left++];
        } else {
            $result[] = $nums[$right--];
        }
    }
    
    return $result;
}

// 示例
$nums = [1, 3, 2, 2, 5, 2, 3, 7];
$result = minAbsoluteSumDiff($nums);
print_r($result);

Python 示例代码

def min_absolute_sum_diff(nums):
    nums.sort()  # 对数组进行排序
    n = len(nums)
    result = []
    left, right = 0, n - 1
    
    # 交错放置元素
    for i in range(n):
        if i % 2 == 0:
            result.append(nums[left])
            left += 1
        else:
            result.append(nums[right])
            right -= 1
    
    return result

# 示例
nums = [1, 3, 2, 2, 5, 2, 3, 7]
result = min_absolute_sum_diff(nums)
print(result)

JavaScript 示例代码

function minAbsoluteSumDiff(nums) {
    nums.sort((a, b) => a - b); // 对数组进行排序
    const n = nums.length;
    const result = [];
    let left = 0;
    let right = n - 1;
    
    // 交错放置元素
    for (let i = 0; i < n; i++) {
        if (i % 2 === 0) {
            result.push(nums[left++]);
        } else {
            result.push(nums[right--]);
        }
    }
    
    return result;
}

// 示例
const nums = [1, 3, 2, 2, 5, 2, 3, 7];
const result = minAbsoluteSumDiff(nums);
console.log(result);

码小课网站中有更多相关内容分享给大家学习,包括算法面试题解析、数据结构深入理解等,帮助大家提升编程能力和面试技巧。

推荐面试题