最小极差分组

2026 华为OD机试真题 6月28日华为OD上机新系统考试真题 100 分题型

点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解

题目描述

给定 n 个整数,你需要将它们任意分成两组,且两组都不能为空。

对于一组数,它的极差定义为该组中的最大值减去最小值。

设两组分别为第 1 组和第 2 组,则它们的极差分别为:

  • 第 1 组极差 = 第 1 组最大值 − 第 1 组最小值
  • 第 2 组极差 = 第 2 组最大值 − 第 2 组最小值

你的目标是最小化这两个极差之和,即最小化:

(max1−min1)+(max2−min2)

2026 华为OD机试真题 6月28日华为OD上机新系统考试真题 100 分题型

输入描述

  • 第一行:整数 n(数字个数)
  • 第二行:n 个整数,用逗号分隔

输出描述

  • 最小极差之和(整数)

示例1

输入

5
10,1,5,3,8

输出

6

说明

划分为 [10,8] 和 [1,5,3] 两组

  • 左极差 = 5-1 = 4
  • 右极差 = 10-8 = 2
  • 总和 = 6

示例2

输入

5
1,1,9,1,9

输出

说明

分组为 [1,1,1] 和 [9,9]

两组的极差均为 0,和也为 0

示例3

输入

2
1,2

输出

说明

只能分为两组,每组一个数。每组的最大最小值是同一个数,极差为 0。

解题思路

核心思想

贪心 + 排序:最优分割点一定在排序后数组的某个位置。

关键观察

  1. 排序后,假设在位置 k 分割([0..k] 为左组,[k+1..n-1] 为右组)
  2. 左组最小值 = nums[0],左组最大值 = nums[k]
  3. 右组最小值 = nums[k+1],右组最大值 = nums[n-1]
  4. 总极差 = (nums[k] - nums[0]) + (nums[n-1] - nums[k+1])

贪心策略

  • 遍历所有可能的分割点 k(0 到 n-2)
  • 找到使总极差最小的分割点

算法步骤

  1. 对数组排序
  2. 初始化最小值为一个大数
  3. 遍历 k 从 0 到 n-2:
    • 计算当前分割点的总极差
    • 更新最小值
  4. 返回最小极差

复杂度分析

  • 时间复杂度:O(n log n),排序占主导
  • 空间复杂度:O(1)
THE END