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.
Input: nums = [1], k = 0 Output: 0 Explanation: The score is max(nums) - min(nums) = 1 - 1 = 0.
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.
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.
1 <= nums.length <= 104
0 <= nums[i] <= 104
0 <= k <= 104
impl Solution {
pub fn smallest_range_ii(nums: Vec<i32>, k: i32) -> i32 {
let n = nums.len();
let mut nums = nums.into_iter().map(|x| x + k).collect::<Vec<_>>();
let mut ret = 0;
nums.sort_unstable();
if nums[n - 1] - 2 * k < nums[0] {
ret = nums[n - 1] - nums[0];
} else {
for i in 1..nums.len() {
if nums[i] - 2 * k >= nums[0] {
ret = nums[i - 1].max(nums[n - 1] - 2 * k) - nums[0];
break;
}
}
}
for i in 1..nums.len() {
if nums[i] - 2 * k > nums[0] {
break;
}
ret = ret.min(nums[i - 1].max(nums[n - 1] - 2 * k) - nums[i] + 2 * k);
}
ret
}
}