每日一题|910.最小差值II|数组排序思路、单调性
显然,较小的值增加,较大的值减小,能够得到较小的差值。
为此,我们用一个i
把当前的排序后的数组分成两个部分,i以前的部分是较小值,i
以后是较大值。
前一个部分增加k,后一个部分减小k。我们思考更新后的数组的最大、最小值来自哪里。
新的最大值只能来自原数组的最大值(排序后的最后一个数字)-k
,或者i以前的部分(包括i)的最大值 + k
。因为i以后的值都减小k,不可能比原最大值-k还要大。
new_max = max(ori_max - k, nums[i] + k) // nums[i]是排序后数组i以前部分中最大的
同理,我们可以得到新的最小值:
new_min = min(ori_min + k, nums[i + 1] - k) // nums[i + 1]是i以后部分中最小的
所以,只需要遍历一次nums,就可以得到最小的差值
res = min(res, new_max - new_min)
class Solution:
def smallestRangeII(self, nums: List[int], k: int) -> int:
nums.sort()
min_, max_ = nums[0], nums[-1]
res = max_ - min_
for i in range(len(nums) - 1):
a, b = nums[i], nums[i+1]
res = min(res, max(nums[i] + k, max_ - k) - min(nums[i+1] - k, min_ + k))
return res