You are given an integer array nums and an integer k.
For each index i where 0 <= i < nums.length, change nums[i] to be either nums[i] + k or nums[i] - k.
The score of nums is the difference between the maximum and minimum elements in nums.
Return the minimum score of nums after changing the values at each index.
Example 1:
Input: nums = [1], k = 0
Output: 0
Explanation: The score is max(nums) - min(nums) = 1 - 1 = 0.
Example 2:
Input: nums = [0,10], k = 2
Output: 6
Explanation: Change nums to be [2, 8]. The score is max(nums) - min(nums) = 8 - 2 = 6.
Example 3:
Input: nums = [1,3,6], k = 3
Output: 3
Explanation: Change nums to be [4, 6, 3]. The score is max(nums) - min(nums) = 6 - 3 = 3.
Constraints:
1 <= nums.length <= 104
0 <= nums[i] <= 104
0 <= k <= 104
After sorting the array, if we want to minimize max-min by +k or -k, there’s a partition in the final sorted array where all the left items +k and all the right ones -k. It’s easy to demonstrate this by enumerate all situations. So the final code is:
class Solution:
def smallestRangeII(self, nums: List[int], k: int) -> int:
sorted_nums = sorted(nums)
l = len(sorted_nums)
res = sorted_nums[l-1]-sorted_nums[0]
for i in range(l-1):
candidate_min = min(sorted_nums[0]+k, sorted_nums[i+1]-k)
candidate_max = max(sorted_nums[l-1]-k, sorted_nums[i]+k)
res = min(res, candidate_max-candidate_min)
return res