我最近在一次采访中遇到了一个问题,即给我一个鳄鱼大小和一个代表池塘中鱼大小的阵列。 鳄鱼可以吃的鱼少于鱼的大小,每次吃那条鱼,鱼的大小都会随着鱼的大小而增加。我们可以在数组上执行两次任意类型的操作。
鉴于鳄鱼的原始大小和池塘中鱼类的数量,我们必须找到最小的数量。以便清空代表池塘的数组。
例如-
鳄鱼的初始大小为20,鱼的排列为
[10,15,20,30,100]
在这种情况下,鳄鱼吃掉了100条以外的所有鱼,并且它的大小变为85,因此解决方案之一可能是删除100号鱼。因此输出为1。
实现上述问题的最佳算法是什么,可以递归解决吗?
答案 0 :(得分:2)
因此,首先,对数组进行排序。鳄鱼会吃掉每条比他小的鱼。从左边开始,如果鳄鱼可以吃鱼,则增加他的体型。如果没有鱼,则返回0。否则,输入两个变量,一个可能的结果=无穷大,并且actions =0。可能的答案之一是删除其余的鱼。将结果设置为最小值(结果,fish_left +动作)。然后尝试添加新的鱼。您始终希望鳄鱼尽可能地长大,因此插入一条比鳄鱼小1的鱼(将其大小乘以2并减小1)。将动作增加一。让鳄鱼吃掉所有可能的鱼。重复直到所有鱼都吃完,然后返回结果。如果数量真的很大,您最终可能会增加很多鱼,那么我们如何克服呢?好吧,到目前为止,您的最低答案就是结果。如果您执行的动作多于当前结果,那么您将无法获得更好的动作,因此可以结束循环并返回结果。因此,我们的复杂度为O(n)-数组的大小。无法想象更快的速度。编辑:实际上是O(n log n),因为排序。而且您可以递归地执行所有操作(实际上是所有操作),但是我在这里看不到这样做的意义。