Skip to content

1675. Minimize Deviation in Array 👍

  • Time: $O(\log\max(\texttt{nums}) \cdot n\log n)$
  • Space: $O(n)$
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
 public:
  int minimumDeviation(vector<int>& nums) {
    int ans = INT_MAX;
    int mini = INT_MAX;
    priority_queue<int> maxHeap;

    for (const int num : nums) {
      const int evenNum = num % 2 == 0 ? num : num * 2;
      mini = min(mini, evenNum);
      maxHeap.push(evenNum);
    }

    while (maxHeap.top() % 2 == 0) {
      const int maxi = maxHeap.top();
      maxHeap.pop();
      ans = min(ans, maxi - mini);
      mini = min(mini, maxi / 2);
      maxHeap.push(maxi / 2);
    }

    return min(ans, maxHeap.top() - mini);
  }
};
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
  public int minimumDeviation(int[] nums) {
    int ans = Integer.MAX_VALUE;
    int min = Integer.MAX_VALUE;
    Queue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder());

    for (final int num : nums) {
      final int evenNum = num % 2 == 0 ? num : num * 2;
      min = Math.min(min, evenNum);
      maxHeap.offer(evenNum);
    }

    while (maxHeap.peek() % 2 == 0) {
      final int max = maxHeap.poll();
      ans = Math.min(ans, max - min);
      min = Math.min(min, max / 2);
      maxHeap.offer(max / 2);
    }

    return Math.min(ans, maxHeap.peek() - min);
  }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
class Solution:
  def minimumDeviation(self, nums: List[int]) -> int:
    ans = math.inf
    mini = math.inf
    maxHeap = []

    for num in nums:
      evenNum = num if num % 2 == 0 else num * 2
      heapq.heappush(maxHeap, -evenNum)
      mini = min(mini, evenNum)

    while maxHeap[0] % 2 == 0:
      maxi = -heapq.heappop(maxHeap)
      ans = min(ans, maxi - mini)
      mini = min(mini, maxi // 2)
      heapq.heappush(maxHeap, -maxi // 2)

    return min(ans, -maxHeap[0] - mini)