可以通过调整数组中的元素,使得最大值和最小值尽可能接近,从而最小化最大值与最小值的差值。
解决思路:
-
找到数组的最大值和最小值:
-
初始情况下,数组的最大值为
max(nums)
,最小值为min(nums)
,它们的差值为max(nums) - min(nums)
。
-
-
通过操作调整数值范围:
-
每个元素
nums[i]
可以调整范围[-k, k]
,因此:-
最小值
min(nums)
可以增加最多k
,变为min(nums) + k
。 -
最大值
max(nums)
可以减少最多k
,变为max(nums) - k
。
-
-
-
计算可能的最小差值:
-
经过调整后,新的最小值为
min(nums) + k
,新的最大值为max(nums) - k
。 -
目标是计算
(max(nums) - k) - (min(nums) + k)
,即: -
但如果
max(nums) - k
变得小于min(nums) + k
,即新的最大值小于新的最小值,我们可以认为数组的所有元素已经可以调整为一个值,那么最小差值就是0
。
-
代码实现:
def smallestRangeI(nums, k):
return max(0, max(nums) - min(nums) - 2 * k)
# 示例
print(smallestRangeI([1, 3, 6], 3)) # 输出 0
print(smallestRangeI([0, 10], 2)) # 输出 6
复杂度分析:
-
找到
max(nums)
和min(nums)
需要O(n)
时间。 -
计算公式是
O(1)
。 -
总体复杂度:O(n)。
示例分析:
示例 1:
nums = [1, 3, 6], k = 3
max(nums) = 6, min(nums) = 1
计算:max(0, (6 - 1) - 2 * 3) = max(0, 5 - 6) = max(0, -1) = 0
示例 2:
nums = [0, 10], k = 2
max(nums) = 10, min(nums) = 0
计算:max(0, (10 - 0) - 2 * 2) = max(0, 10 - 4) = max(0, 6) = 6
这样,我们可以在 O(n)
时间内求解最小的分数。 🚀