在Python中最小化数组偏差的程序

在Python中最小化数组偏差的程序

假设我们有一个数组nums。我们可以对数组的任何元素执行两种类型的操作任意次数

  • 对于偶数元素,将其除以2

  • 对于奇数元素,将其乘以2。

现在数组的偏差是数组中任意两个元素之间的最大差异。我们必须找到执行一些操作后数组可以拥有的最小偏差。

因此,如果输入如下 nums = [6,3,7,22,5] ,则输出为5,因为我们可以在一次操作[6,6,7,22,5]中使数组变为,在第二次操作期间[6,6,7,22,10]中变为,在另一个操作期间[6,6,7,11,10]中变为,现在偏差是11-6 = 5。

为了解决这个问题,我们将按照以下步骤进行 :

  • 将列表nums排序

  • max_v:nums的最大元素

  • min_v:nums的最小元素

  • 堆化nums

  • res: max_v – min_v

  • 当nums [0]为奇数时,执行以下操作

    • v:从堆队列nums中弹出的元素

    • v:2 * v

    • 将v插入堆队列nums中

    • min_v:nums [0]

    • max_v:v和max_v中的最大值

    • res:res和(max_v – min_v)的最小值

  • nums:n和负数顺序中的所有数字的列表

  • 堆化堆队列nums

  • 当nums [0]为偶数时,执行以下操作

    • v:从堆队列nums中弹出的负数元素

    • v:v // 2的商

    • 将-v插入堆队列nums中

    • max_v:-nums [0]

    • min_v:min_v和v的最小值

    • res:res和(max_v – min_v)的最小值

  • 返回res

示例

让我们看以下实现以获得更好的理解

import heapq
def solve(nums):
   nums.sort()
   max_v,min_v = nums[-1],nums[0]
   heapq.heapify(nums)
   res = max_v-min_v
   while nums[0]%2==1:
      v = heapq.heappop(nums)
      v = 2 * v
      heapq.heappush(nums, v)
      min_v = nums[0]
      max_v = max(v, max_v)
      res = min(res, max_v - min_v)

   nums = [-n for n in nums]
   heapq.heapify(nums)
   while nums[0]%2==0:
      v = -heapq.heappop(nums)
      v = v // 2
      heapq.heappush(nums, -v)
      max_v = -nums[0]
      min_v = min(min_v,v)
      res = min(res, max_v - min_v)

   return res

nums = [6,3,7,22,5]
print(solve(nums))

输入

[6,3,7,22,5]

输出

5

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程