arrays - 将可能的最小正整数插入唯一整数数组
问题描述
我正在尝试解决这个面试问题:给定一个唯一的正整数数组,找到插入其中的最小可能数字,以便每个整数仍然是唯一的。该算法应该在 O(n) 中,并且额外的空间复杂度应该是恒定的。允许将数组中的值分配给其他整数。
例如,对于数组[5, 3, 2, 7]
,输出应该是 1。但是对于[5, 3, 2, 7, 1]
,答案应该是 4。
我的第一个想法是对数组进行排序,然后再次遍历数组以找到连续序列中断的位置,但排序需要的不仅仅是 O(n)。
任何想法,将不胜感激!
解决方案
我的尝试:
该数组A
假定为 1-indexed。我们称一个非零且不超过的活动n
值。
扫描数组,直到找到一个活动值,让
A[i] = k
(如果找不到,停止);A[k]
活动时,- 清除时移动
A[k]
到;k
A[k]
- 清除时移动
继续,
i
直到到达数组的末尾。
在此通过之后,与数组中某个整数对应的所有数组条目都将被清除。
- 找到第一个非零条目,并报告它的索引。
例如
[5, 3, 2, 7], clear A[3]
[5, 3, 0, 7], clear A[2]
[5, 0, 0, 7], done
答案是1
。
例如
[5, 3, 2, 7, 1], clear A[5],
[5, 3, 2, 7, 0], clear A[1]
[0, 3, 2, 7, 0], clear A[3],
[0, 3, 0, 7, 0], clear A[2],
[0, 0, 0, 7, 0], done
答案是4
。
第一遍的行为是线性的,因为每个数字都被查看一次(并立即清除),并i
定期增加。
第二遍是线性搜索。
A= [5, 3, 2, 7, 1]
N= len(A)
print(A)
for i in range(N):
k= A[i]
while k > 0 and k <= N:
A[k-1], k = 0, A[k-1] # -1 for 0-based indexing
print(A)
[5, 3, 2, 7, 1]
[5, 3, 2, 7, 0]
[0, 3, 2, 7, 0]
[0, 3, 2, 7, 0]
[0, 3, 0, 7, 0]
[0, 0, 0, 7, 0]
[0, 0, 0, 7, 0]
更新:
基于 גלעד ברקן 的想法,我们可以以不破坏值的方式标记数组元素。然后你报告第一个未标记的索引。
print(A)
for a in A:
a= abs(a)
if a <= N:
A[a-1]= - A[a-1] # -1 for 0-based indexing
print(A)
[5, 3, 2, 7, 1]
[5, 3, 2, 7, -1]
[5, 3, -2, 7, -1]
[5, -3, -2, 7, -1]
[5, -3, -2, 7, -1]
[-5, -3, -2, 7, -1]
推荐阅读
- reactjs - 如何将我的 Docker React 容器配置为仅在需要时安装模块?
- c - VS code c 编程,我该如何修复-Makefile:2: *** 缺少分隔符。停止。?
- amazon-web-services - 跨 AWS 账户的 DynamoDB 复制
- javascript - 在搜索文本时隐藏 h4
- python - 在重新加载不同目录中以编程方式导入的文件时找不到 ModuleSpec
- python-3.x - 如何与龙卷风 IOLoop 同时运行长时间运行的阻塞功能
- r - 不应该在 org 模式下以 R 代码块打印的输出
- javascript - 将 Select 的选项替换为 Checkbox
- html - 如何使用 Div 在页面上格式化 2 个不同的表格?
- android-studio - Android Studio 不显示 Flutter 源代码