> For the complete documentation index, see [llms.txt](https://mayanktyagi3111.gitbook.io/interview-prep/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://mayanktyagi3111.gitbook.io/interview-prep/strings-arrays-and-2-pointers/minimum-difference-between-largest-and-smallest-value-in-three-moves.md).

# 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^`

```java
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;
    }
}
```
