【问题标题】:Minimum number of operations required所需的最少操作次数
【发布时间】: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,您必须同时对 1420 采取行动,但只有 20 是极值。在您真正看到2 之前,您无法决定如何处理14,所以我认为O(N) 是不可能的。
  • 要明确的是,在对一个数进行第二次运算后,下一次只能对其进行第一次运算,因为它现在可以被 k 整除

标签: algorithm math data-structures


【解决方案1】:

这在O(NlogN) 中是可行的。对于每个元素,我们可以写出它可以转换成的每个元素。因此,让每个元素转换为它可以成为的候选元素列表。现在问题变成了smallest range covering elements from k lists,可以在O(NlogN) 中完成。

解决最小范围问题的一个非常简单的方法:

  1. 将每个列表中的元素合并到一个列表中,跟踪每个元素来自的列表
  2. 在合并的列表上运行一个滑动窗口,每个子列表都有一个元素

  3. 选取候选范围

以下是我对最小范围问题的解决方案。您只需要一些样板代码即可将整数列表转换为列表列表。

from collections import deque, Counter

class Solution:
    def smallestRange(self, nums: List[List[int]]) -> List[int]:

        new = []
        # merge each list and keep track of original list
        for i in range(len(nums)):
            for j in nums[i]:
                new.append((j, i))
        # sort so each sliding window represents a range
        new.sort()

        d = deque()
        c = Counter()

        res = [-float('inf'), float('inf')]
        # iterate over sliding windows that contain each list
        for i in new:
            d.append(i)
            c[i[1]] += 1
            while len(c) == len(nums):
                res = min(res, [d[0][0], d[-1][0]], key = lambda x: x[1] - x[0])
                a, b = d.popleft()
                c[b] -= 1
                if not c[b]: del c[b]
        return res

【讨论】:

  • @גלעדברקן 你是对的,但我假设每个元素都是一个整数,所以我只是让 logm 以 32 为界
  • 我认为这是正确的,但是,您缺少find minimum number of operations 的步骤,但是,应该是对当前解决方案的简单修改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
  • 1970-01-01
  • 2018-10-10
  • 1970-01-01
  • 1970-01-01
  • 2020-02-27
相关资源
最近更新 更多