【问题标题】:Find minimum number of operations on to empty an array查找清空数组的最小操作数
【发布时间】:2018-09-08 18:37:50
【问题描述】:

我最近在一次采访中遇到了一个问题,其中给了我一条鳄鱼的大小和一个代表池塘中鱼大小的数组。 鳄鱼可以吃小于它大小的鱼,每次它吃那条鱼时,它的大小都会增加那条鱼的大小。我们可以对数组执行任意次数的两种类型操作。

  1. 从池塘中取出所有鱼
  2. 向池塘添加任何大小的鱼

鉴于鳄鱼的初始大小和池塘中的鱼群,我们必须找到最小的数量。这样的操作,以便清空代表池塘的数组。

例如 -

鳄鱼的初始大小是20,鱼的数组是

[10,15,20,30,100]

在这种情况下,鳄鱼吃掉了除 100 之外的所有鱼,它的大小变成了 85,因此解决方案之一可能是移除大小为 100 的鱼。因此输出将为 1。

实现上述问题的最佳算法是什么,可以递归解决吗?

【问题讨论】:

标签: arrays algorithm language-agnostic


【解决方案1】:

首先,对数组进行排序。鳄鱼会吃掉每条比他小的鱼。从左边开始,如果鳄鱼可以吃鱼,增加他的大小。如果没有鱼,则返回 0。如果没有,则创建两个变量,潜在结果 = 无穷大,动作 = 0。可能的答案之一是删除其余的鱼。将结果设置为最小值(结果,fish_left + 动作)。然后尝试添加新鱼。你总是希望鳄鱼长得尽可能大,所以插入一条比鳄鱼小 1 的鱼(将它的大小乘以 2 并减少 1)。动作加一。让鳄鱼吃掉所有可能的鱼。重复直到所有的鱼都吃完,然后返回结果。如果数字真的很大,你最终可能会添加大量的鱼,那么我们如何克服它呢?好吧,到目前为止,您的最低答案是结果。如果您执行的操作比当前结果多,则无法获得更好的操作,因此您可以结束循环并返回结果。所以我们的复杂度是 O (n) - 数组的大小。无法想象一个更快的。编辑:实际上 O (n log n) 因为排序。你可以递归地做所有事情(字面意思是所有事情),但我真的不明白在这里做这件事的意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    • 2013-04-24
    • 2015-04-09
    • 2018-09-24
    • 2021-11-10
    • 1970-01-01
    相关资源
    最近更新 更多