当前位置: 首页 > news >正文

最小差值 II

> Problem: 910. 最小差值 II

题目描述

给定一个整数数组 nums 和一个整数 k,你可以对数组中的每个元素 nums[i] 执行一次变更操作:将其加上或减去 k。操作后的数组的分数定义为该数组中的最大元素与最小元素的差值。你的任务是返回经过操作后的数组的最小分数。

示例

  1. 输入nums = [1], k = 0

    • 输出0
    • 解释:数组的最大值和最小值都是 1,因此差值为 0
  2. 输入nums = [0, 10], k = 2

    • 输出6
    • 解释:可以将数组变为 [2, 8],此时最大值是 8,最小值是 2,差值为 6
  3. 输入nums = [1, 3, 6], k = 3

    • 输出3
    • 解释:可以将数组变为 [4, 6, 3],此时最大值是 6,最小值是 3,差值为 3

解题思路

这个问题的本质是如何通过对每个元素进行 +k-k 操作,将数组的最大值和最小值尽量靠近,从而最小化差值。

关键观察
  1. 操作后,数组的最大值可能是原最大值减去 k 或原最小值加上 k
  2. 操作后,数组的最小值可能是原最小值加上 k 或原最大值减去 k

因此,问题可以转化为:如何通过选择对每个元素加 k 还是减 k,来最小化数组中最大值与最小值的差距?

我们可以利用以下几条规则:

  • 最大值:如果我们对数组的最大值减去 k,而对最小值加上 k,能够将最大值和最小值尽量靠近。
  • 最小化差值:问题转化为我们需要尽量靠近 最大值减 k最小值加 k 的差距。
具体步骤
  1. 排序数组。这样可以方便地找到数组中的最小值和最大值。
  2. 考虑极限情况,最大值和最小值的可能调整情况分别是:最大值减去 k 和最小值加上 k
  3. 计算最大差值,比较调整后差值的最小情况。

代码实现

class Solution {
public:int smallestRangeII(vector<int>& nums, int k) {// 将数组排序sort(nums.begin(), nums.end());int n = nums.size();// 初始分数是最大值与最小值的差int result = nums[n - 1] - nums[0];// 遍历数组,尝试调整for (int i = 0; i < n - 1; i++) {int high = max(nums[n - 1] - k, nums[i] + k);  // 调整后的最大值int low = min(nums[0] + k, nums[i + 1] - k);   // 调整后的最小值result = min(result, high - low);              // 更新最小分数}return result;}
};

复杂度分析

  • 时间复杂度:O(n log n),其中 n 是数组的长度。排序的时间复杂度是 O(n log n),遍历数组的时间复杂度是 O(n)。
  • 空间复杂度:O(1),只使用了常数级别的额外空间。

解释

  1. 排序:我们首先对数组进行排序,便于确定最大值和最小值的候选项。
  2. 遍历调整:通过遍历数组,我们尝试每一对相邻元素的调整组合来最小化最大差值。
  3. 更新最小分数:我们对每一个可能的调整组合计算最大值和最小值,并不断更新最小分数。

总结

这道题的关键在于理解如何利用加 k 和减 k 操作来最小化最大值和最小值之间的差距。通过排序和遍历相邻元素的组合,可以有效地找到最优解。


http://www.mrgr.cn/news/55805.html

相关文章:

  • Shiro框架认证机制详解
  • iOS 大数相加
  • Java的魔法世界:面向对象编程(OOP)是什么?
  • docker compose 容器单机编排
  • 国庆旅游高峰期,如何利用可视化报表来展现景区、游客及消费数据
  • 搭建LeNet-5神经网络,并搭建自己的图像分类训练和测试的模板,模板通用!!!均有详细注释。
  • 大模型 Agent 概述
  • 关于懒汉饿汉模式下的线程安全问题
  • C++基础与实用技巧第三课:内存管理与性能优化
  • 字典学习算法
  • Stylish Archer Assets Pack 女弓箭手射箭动画动作
  • Docker 部署 EMQX 一分钟极速部署
  • 什么是运动控制器?运动控制器的特点
  • Echarts 点击事件无法使用 this 或者 this绑定的数据无法获取
  • 使二进制数组全部等于 1 的最少操作次数 II
  • 回归预测||时序预测||基于灰狼优化的时域卷积TCN连接Transformer-BiLSTM的数据回归预测|时序预测Matlab程序
  • 现代C语言:C23标准重大更新
  • Moectf-week1-wp
  • WSL2Linux 子系统(十三)
  • Mybatis 中<where>的用法注意事项(附Demo)
  • 商场楼宇室内导航系统
  • 不再手动处理繁琐任务!Python自动化方案梳理
  • 【力扣刷题实战】用队列实现栈
  • SpringBoot整合mybatisPlus实现批量插入并获取ID
  • 用docker Desktop 下载使用thingsboard/tb-gateway
  • 【Java面试——并发编程——相关类和关键字——Day4】