最小差值 I

给你一个整数数组 nums,和一个整数 k 。

在一个操作中,您可以选择 0 <= i < nums.length 的任何索引 i 。将 nums[i] 改为 nums[i] + x ,其中 x 是一个范围为 [-k, k] 的任意整数。对于每个索引 i ,最多 只能 应用 一次 此操作。

nums 的 分数 是 nums 中最大和最小元素的差值。 

在对  nums 中的每个索引最多应用一次上述操作后,返回 nums 的最低 分数 。

示例 1:

输入:nums = [1], k = 0
输出:0
解释:分数是 max(nums) - min(nums) = 1 - 1 = 0。

示例 2:

输入:nums = [0,10], k = 2
输出:6
解释:将 nums 改为 [2,8]。分数是 max(nums) - min(nums) = 8 - 2 = 6。

示例 3:

输入:nums = [1,3,6], k = 3
输出:0
解释:将 nums 改为 [4,4,4]。分数是 max(nums) - min(nums) = 4 - 4 = 0。

提示:

  • 1 <= nums.length <= 104
  • 0 <= nums[i] <= 104
  • 0 <= k <= 104

主要考察什么内容:

这道题主要考察的是如何通过有限的操作次数来最小化数组的最大值和最小值之间的差值。具体来说,题目要求我们通过将数组中的每个元素增加或减少一个在 [−k,k][−k,k] 范围内的整数,使得数组的最大值和最小值之间的差值尽可能小。

解题思路 

  1. 找到数组的最大值和最小值

    • 使用 Math.max 和 Math.min 函数找到数组中的最大值 maxNum 和最小值 minNum
  2. 计算最大值和最小值的变化范围

    • 对于最大值 maxNum,我们可以将其减少最多 k,即 maxNum - k
    • 对于最小值 minNum,我们可以将其增加最多 k,即 minNum + k
  3. 计算新的最大值和最小值的差值

    • 新的最大值是 maxNum - k
    • 新的最小值是 minNum + k
    • 新的差值是 (maxNum - k) - (minNum + k) = maxNum - minNum - 2k
  4. 处理特殊情况

    • 如果 maxNum - minNum <= 2k,那么我们可以通过适当的调整使所有元素相等,从而使差值为 0。
    • 否则,新的差值就是 maxNum - minNum - 2k
  5. function smallestRangeI(nums, k) {
        // 找到数组的最大值和最小值
        const maxNum = Math.max(...nums);
        const minNum = Math.min(...nums);
        
        // 计算新的差值
        const newDiff = maxNum - minNum - 2 * k;
        
        // 如果新的差值小于等于0,返回0;否则返回新的差值
        return Math.max(0, newDiff);
    }
    
    // 示例测试
    console.log(smallestRangeI([1], 0));       // 输出: 0
    console.log(smallestRangeI([0, 10], 2));   // 输出: 6
    console.log(smallestRangeI([1, 3, 6], 3)); // 输出: 0

    通过这种方式,我们可以有效地最小化数组的最大值和最小值之间的差值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值