在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