查找最小数量的操作以清空数组

时间:2018-09-08 18:37:51

标签: arrays algorithm language-agnostic

我最近在一次采访中遇到了一个问题,即给我一个鳄鱼大小和一个代表池塘中鱼大小的阵列。 鳄鱼可以吃的鱼少于鱼的大小,每次吃那条鱼,鱼的大小都会随着鱼的大小而增加。我们可以在数组上执行两次任意类型的操作。

  1. 从池塘中捞出鱼
  2. 在池塘中添加任何大小的鱼

鉴于鳄鱼的原始大小和池塘中鱼类的数量,我们必须找到最小的数量。以便清空代表池塘的数组。

例如-

鳄鱼的初始大小为20,鱼的排列为

[10,15,20,30,100]

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

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

1 个答案:

答案 0 :(得分:2)

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