Problem Link

Description


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.
    <ul>
    	<li>For example, if the array is <code>[1,2,3,4]</code>, then you can do this operation on the last element, and the array will be <code>[1,2,3,<u>2</u>].</code></li>
    </ul>
    </li>
    <li>If the element is <strong>odd</strong>, <strong>multiply</strong> it by <code>2</code>.
    <ul>
    	<li>For example, if the array is <code>[1,2,3,4]</code>, then you can do this operation on the first element, and the array will be <code>[<u>2</u>,2,3,4].</code></li>
    </ul>
    </li>
    

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 <= 5 * 104
  • 1 <= nums[i] <= 109

Solution


Python3

class Solution:
    def minimumDeviation(self, nums: List[int]) -> int:
        N = len(nums)
        heap = []
 
        for x in nums:
            heappush(heap, -x if x % 2 == 0 else -x * 2)
        
        mmin = -max(heap)
        res = inf
 
        while len(heap) == N:
            x = -heappop(heap)
            res = min(res, x - mmin)
 
            if x % 2 == 0:
                mmin = min(mmin, x // 2)
                heappush(heap, -x // 2)
 
        return res