【发布时间】:2020-02-12 05:53:33
【问题描述】:
我在最近的采访中遇到了这个问题:
给定一个整数数组和一个整数 k。您可以对数组中任意数量的元素执行任意次数(可能为零)的操作:
如果数字能被k整除,则将其除以k(如果能被整除,则不能乘以k)
如果数字不能被k整除,则乘以k
您需要更新此数组,使数组中的最大数和最小数之间的差异最小,并找到最小的操作数。
例如让 a[5] = {82, 79, 38, 49, 9} 和 k=5,我们对最后一个元素应用第二次操作。现在,a[5] = {82, 79, 38, 49, 9*5} 并且这个更新后的数组给出了最小和最大数字之间的最小差异,即 max - min = 82 - 38 = 44
我正在考虑应用递归解决方案来固定一个数字并尝试使所有数字都尽可能接近固定数字。
但是需要更好的方法来有效地解决这个问题。 提前致谢。
【问题讨论】:
-
您只能通过对最大/最小数字应用操作来减少差异。我认为你只需要继续尝试应用最大/最小,只要移动可以减少总范围。显然,您必须随时重新计算最大值和最小值。每个元素只有固定数量的移动,因此带有 BST 的
O(NlogN)是可行的。我可能缺少O(N)方式 -
数字总是正数吗?
-
是的,所有数字都是正数
-
@Primusa 这不一定是真的,例如
items = [14, 2, 20]和k = 2,您必须同时对14和20采取行动,但只有20是极值。在您真正看到2之前,您无法决定如何处理14,所以我认为O(N)是不可能的。 -
要明确的是,在对一个数进行第二次运算后,下一次只能对其进行第一次运算,因为它现在可以被 k 整除
标签: algorithm math data-structures