Minimum Difference Between Largest and Smallest Value in Three Moves

Given an array nums, you are allowed to choose one element of nums and change it by any value in one move.

Return the minimum difference between the largest and smallest value of nums after perfoming at most 3 moves.

Example 1:

Input: nums = [5,3,2,4]
Output: 0
Explanation: Change the array [5,3,2,4] to [2,2,2,2].
The difference between the maximum and minimum is 2-2 = 0.

Example 2:

Input: nums = [1,5,0,10,14]
Output: 1
Explanation: Change the array [1,5,0,10,14] to [1,1,0,1,1]. 
The difference between the maximum and minimum is 1-0 = 1.

Example 3:

Input: nums = [6,6,0,1,1,4,6]
Output: 2

Example 4:

Input: nums = [1,5,6,14,15]
Output: 1

Constraints:

  • 1 <= nums.length <= 10^5

  • -10^9 <= nums[i] <= 10^

class Solution {
    // Can also be done without sorting, if we find out top 4 and min 4 elements in the array
    public int minDifference(int[] nums) {
        Arrays.sort(nums);
        if (nums.length <= 4)
            return 0;
        int min = nums[0], max = nums[nums.length - 1];
        if (max - min == 0)
            return 0;
        // Answer with no "moves"
        int diff = max - min;
        // Answers with different "moves"
        for (int replacement = 1; replacement <= 3; replacement++)
            // Trying different combinations by dividing moves between front & back
            for (int i = 0; i <= replacement; i++)
                diff = Math.min(diff, nums[nums.length - (replacement - i) - 1] - nums[i]);
        return diff;
    }
}

Last updated