# Minimize Deviation in Array

Updated: Mar 25, 2021

You are given an array nums of n positive integers.

You can perform two types of operations on any element of the array any number of times:

If the element is

**even**,**divide**it by 2.For example, if the array is [1,2,3,4], then you can do this operation on the last element, and the array will be [1,2,3,

__2__].If the element is

**odd**,**multiply**it by 2.For example, if the array is [1,2,3,4], then you can do this operation on the first element, and the array will be [

__2__,2,3,4].

The **deviation** of the array is the **maximum difference** between any two elements in the array.

Return *the minimum deviation the array can have after performing some number of operations.*

**Example 1:**

**Input****:** nums = [1,2,3,4]
**Output****:** 1
**Explanation****:** You can transform the array to [1,2,3,__2__], then to [__2__,2,3,2], then the deviation will be 3 - 2 = 1.

**Example 2:**

**Input****:** nums = [4,1,5,20,3]
**Output****:** 3
**Explanation****:** You can transform the array after two operations to [4,__2__,5,__5__,3], then the deviation will be 5 - 2 = 3.

**Example 3:**

**Input****:** nums = [2,10,8]
**Output****:** 3

**Constraints:**

n == nums.length

2 <= n <= 105

1 <= nums[i] <= 109

**Solution:**

```
class Solution {
public int minimumDeviation(int[] nums) {
TreeSet<Integer> temp = new TreeSet<>();
for(int i: nums){
if(i % 2 == 0){
temp.add(i);
}
else{
temp.add(i * 2);
}
}
int md = temp.last() - temp.first();
int m = 0;
while(temp.size() > 0 && temp.last() % 2 == 0){
m = temp.last();
temp.remove(m);
temp.add(m / 2);
md = Math.min(md, temp.last() - temp.first());
}
return md;
}
}
```