「这是我参与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 <= 100000 <= nums[i] <= 100000 <= 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的大小。
画个草图简单理解下。
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)