最小差值 I

131 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情

题目描述

给你一个整数数组 nums,和一个整数 k 。 在一个操作中,您可以选择 0 <= i < nums 的任何索引 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

思路分析

从题目中知,给出一个整数数组nums和一个整数k;数组nums中每一个元素和[-k,k]区间内的任何一个整数相加,由于数组nums的每一个元素都可以与[-k,k]区间内的每一个项相加,那么这样就可以得出很多个新的数组,但我们只是想要得出最小值而已;我们可以这样,拿数组nums的最大值和区间内的最小值-k相加得出最大值MaxN,nums的最小值和区间内的最大值k相加得出最小值MinN,然后用 MaxN - MinN得出的值,这个值就是我们想要的最小分数,也有一种可能MaxN减去MinN得出的值小于0,那么我们可以直接返回0就好了。

AC代码

 function smallestRangeI(nums, k) {
    let maxN = Math.max(...nums)
    let minN = Math.min(...nums)
    if((maxN - k) < (minN + k)){
      return 0
    } else {
      return maxN - k - (min + k)
    }
};

总结

想要得到最小值,必须是最大值减去最小值,这样获取到的肯定是其中的最小值了。