数组中不存在的最小整数

Sus*_*ssi -3 php arrays algorithm

写一个函数:

功能解决方案($ A);

在给定N个整数的数组A的情况下,返回A中不存在的最小正整数(大于0).

例如,给定A = [1,3,6,4,1,2],函数应返回5.

再举一个例子,给定A = [1,2,3],函数应该返回4.

给定A = [-1,-3],函数应返回1.

假使,假设:

N是[1..100,000]范围内的整数; 数组A的每个元素都是[-1,000,000..1,000,000]范围内的整数.复杂:

预期的最坏情况时间复杂度是O(N); 预期的最坏情况空间复杂度是O(N),超出输入存储(不计入输入参数所需的存储).可以修改输入数组的元素.

小智 8

function solution($A) {
  $a = array_flip($A);
  for($i=1; isset($a[$i]);$i++);
  return $i;
}
Run Code Online (Sandbox Code Playgroud)

100%性能得分的解决方案!!

  • 这是我推荐和使用的,但这个答案缺少其教育解释。对于寻求算法建议的问题,明智的做法是解释为什么你的答案是最好的,并用“科学”来支持你的主张。 (2认同)

Abr*_*ver 5

不确定您要在代码中执行什么操作,只是从1开始,检查并递增。一旦$i在数组中找不到循环,循环将停止:

function solution($A) {
    for($i=1; in_array($i, $A); $i++);
    return $i;
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案是最干净的,对于实际任务是正确的。但是考虑到这是一个面试问题,其中包含“预期的最坏情况下时间复杂度为O(N)**”,如果被拒绝,我不会感到惊讶。in_array是O(N)并且for循环也是O(N); 总计O(N ^ 2)。预期的解决方案可能类似于“ $ tmp = array_flip($ A); for($ i = 1; isset($ tmp [$ i]); $ i ++); return $ i;”。他们可以说`array_flip`是O(n)(**实际上不是**),而`isset`是O(1)(**实际上不是**)。 (3认同)
  • 这正是这样做的目的。您为什么认为不会呢?它从1开始并递增,因此它将始终是最小的正整数。 (2认同)