arrays - 找到不在列表中的最小整数

标签 arrays algorithm

我的一位同事使用的一个有趣的面试问题:

假设给你一个很长的、未排序的无符号 64 位整数列表。您如何找到没有出现在列表中的最小非负整数?

跟进:既然已经提出了明显的排序解决方案,你能做到比 O(n log n) 更快吗?

跟进:您的算法必须在具有 1GB 内存的计算机上运行

澄清:该列表在 RAM 中,尽管它可能会占用大量内存。预先给定列表的大小,比如 N。

最佳答案

如果数据结构可以就地变异并支持随机访问,那么您可以在 O(N) 时间和 O(1) 额外空间内完成。只需按顺序遍历数组,对于每个索引,将索引处的值写入 value 指定的索引,递归地将该位置的任何值放到它的位置,并丢弃值 > N。然后再次遍历数组寻找位置其中值与索引不匹配 - 这是不在数组中的最小值。这导致最多 3N 次比较,并且只使用一些值的临时空间。

# Pass 1, move every value to the position of its value
for cursor in range(N):
    target = array[cursor]
    while target < N and target != array[target]:
        new_target = array[target]
        array[target] = target
        target = new_target

# Pass 2, find first location where the index doesn't match the value
for cursor in range(N):
    if array[cursor] != cursor:
        return cursor
return N

关于arrays - 找到不在列表中的最小整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1586858/

相关文章:

c# - 超时后失败的最佳方法是什么?

r - 生成包含 n 个元素的所有 k-排列的矩阵的好算法?

php - 在 PHP 中使用列表

arrays - 如何增加数组mongodb下重复值的计数器

arrays - 找到创建数组的最严格上限(在几个选项中)

algorithm - 选择排序算法的改进?

arrays - 为什么在 Go 中调用可变参数函数时不能_直接_使用数组?

javascript - getJSON 无法获取子值

java - 如何在Java中将对象数组转换为字符串数组

c - 给定递归程序的空间复杂度