最小极差分组
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。
解题思路
核心思想
贪心 + 排序:最优分割点一定在排序后数组的某个位置。
关键观察:
- 排序后,假设在位置 k 分割([0..k] 为左组,[k+1..n-1] 为右组)
- 左组最小值 = nums[0],左组最大值 = nums[k]
- 右组最小值 = nums[k+1],右组最大值 = nums[n-1]
- 总极差 = (nums[k] - nums[0]) + (nums[n-1] - nums[k+1])
贪心策略:
- 遍历所有可能的分割点 k(0 到 n-2)
- 找到使总极差最小的分割点
算法步骤
- 对数组排序
- 初始化最小值为一个大数
- 遍历 k 从 0 到 n-2:
- 计算当前分割点的总极差
- 更新最小值
- 返回最小极差
复杂度分析
- 时间复杂度:O(n log n),排序占主导
- 空间复杂度:O(1)
版权声明:
作者:魔改工程师
链接:https://www.sylblog.xin/archives/675
文章版权归作者所有,未经允许请勿转载。
THE END