Smallest Range II

medium greedy sorting math

Problem

Given an integer array nums and an integer k, for every element you must add either +k or −k to it (exactly once each). Return the smallest possible difference between the maximum and minimum values of the resulting array.

Inputnums = [1, 3, 6], k = 3
Output3
Turn nums into [4, 6, 3] (+3, +3, −3); the range 6 − 3 = 3 is the smallest achievable.

def smallest_range_ii(nums, k):
    nums.sort()
    n = len(nums)
    ans = nums[-1] - nums[0]
    for i in range(n - 1):
        hi = max(nums[-1] - k, nums[i] + k)
        lo = min(nums[0] + k, nums[i + 1] - k)
        ans = min(ans, hi - lo)
    return ans
function smallestRangeII(nums, k) {
  nums.sort((a, b) => a - b);
  const n = nums.length;
  let ans = nums[n - 1] - nums[0];
  for (let i = 0; i < n - 1; i++) {
    const hi = Math.max(nums[n - 1] - k, nums[i] + k);
    const lo = Math.min(nums[0] + k, nums[i + 1] - k);
    ans = Math.min(ans, hi - lo);
  }
  return ans;
}
class Solution {
    public int smallestRangeII(int[] nums, int k) {
        Arrays.sort(nums);
        int n = nums.length;
        int ans = nums[n - 1] - nums[0];
        for (int i = 0; i < n - 1; i++) {
            int hi = Math.max(nums[n - 1] - k, nums[i] + k);
            int lo = Math.min(nums[0] + k, nums[i + 1] - k);
            ans = Math.min(ans, hi - lo);
        }
        return ans;
    }
}
int smallestRangeII(vector<int>& nums, int k) {
    sort(nums.begin(), nums.end());
    int n = nums.size();
    int ans = nums[n - 1] - nums[0];
    for (int i = 0; i < n - 1; i++) {
        int hi = max(nums[n - 1] - k, nums[i] + k);
        int lo = min(nums[0] + k, nums[i + 1] - k);
        ans = min(ans, hi - lo);
    }
    return ans;
}
Time: O(n log n) Space: O(1)