LeetCode.908 最小差值 I -

967 阅读2分钟

「这是我参与2022首次更文挑战的第7天,活动详情查看:2022首次更文挑战」。

题目描述:

908. 最小差值 I - 力扣(LeetCode) (leetcode-cn.com)

给你一个整数数组 nums,请你给数组中的每个元素 nums[i] 都加上一个任意数字 x-k <= x <= k),从而得到一个新数组 result

返回数组 result 的最大值和最小值之间可能存在的最小差值。

示例一

输入: nums = [1], k = 0
输出: 0
解释: result = [1]

示例二

输入: nums = [0,10], k = 2
输出: 6
解释: result = [2,8]

示例三

输入: nums = [1,3,6], k = 3
输出: 0
解释: result = [3,3,3] or result = [4,4,4]

提示:

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

思路分析

数学

假设 A 是原始数组,B 是修改后的数组,我们需要找到 B 中最大值和最小值之间可能存在的最小差值,即我们需要最小化 max(B) - min(B),也就是分别最小化 max(B) 和最大化 min(B)

max(B) 最小可能为 max(A) - K,同样,min(B) 最大可能为 min(A) + K。所以结果 max(B) - min(B) 至少为 ans = (max(A) - K) - (min(A) + K)

得到这个结果之后我们只需要比较一下这个结果和0的大小。

画个草图简单理解下。

image.png

AC代码

class Solution {
    public int smallestRangeI(int[] nums, int k) {
        int min = nums[0];
        int max = nums[0];
        for (int x: nums) {
            min = Math.min(min, x);
            max = Math.max(max, x);
        }
        return Math.max(0, max - min - 2*k);

    }
}

总结

题目描述的有点抽象,理解了就容易了,上面那个图能看懂的话也就真的get到题意了。

参考

最小差值 I - 最小差值 I - 力扣(LeetCode) (leetcode-cn.com)

Java-新手小白的简单思路 - 最小差值 I - 力扣(LeetCode) (leetcode-cn.com)

最小差值 I - 最小差值 I - 力扣(LeetCode) (leetcode-cn.com)