zoukankan      html  css  js  c++  java
  • 1675. Minimize Deviation in Array (H)

    Minimize Deviation in Array (H)

    题目

    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 <= 10^5
    • 1 <= nums[i] <= 10^9

    题意

    对一个数组中的数可以进行两种操作:偶数除以2,奇数乘以2。问经过一系列操作,能得到的数组最大值和最小值差值的最小值。

    思路

    为了统一操作,可以先把数组中所有奇数乘以2,这样只需要考虑除以2的操作,得到的新数组和旧数组是等价的。记录最小值,将所有数加入优先队列中,每次取出最大的数top,减去最小值并更新最小差值,如果top是偶数,则除以2重新加入优先队列,否则跳出循环。


    代码实现

    Java

    class Solution {
        public int minimumDeviation(int[] nums) {
            int ans = Integer.MAX_VALUE;
            int min = Integer.MAX_VALUE;
            Queue<Integer> q = new PriorityQueue<>((a, b) -> b - a);
            for (int num : nums) {
                num = num % 2 == 1 ? num * 2 : num;
                q.offer(num);
                min = Math.min(min, num);
            }
            while (true) {
                int max = q.poll();
                ans = Math.min(ans, max - min);
                if (max % 2 == 1) {
                    break;
                }
                max /= 2;
                min = Math.min(min, max);
                q.offer(max);
            }
            return ans;
        }
    }
    
  • 相关阅读:
    八 sizeof枚举
    九 推算程序结果
    十 交换变量特殊写法
    十一 移位-加减优先级 define undef
    十二 部分易忽略的优先级优先级
    十三 C语言的#特殊用法
    十四 访问数组:指针形式,下标形式
    VS出现未加载wntdll.pdb的解决办法
    C++继承产生的问题
    opencv加载图片imread失败的原因
  • 原文地址:https://www.cnblogs.com/mapoos/p/14350732.html
Copyright © 2011-2022 走看看