原地删除重复项
使用一对慢指针和快指针
原地删除重复项 是 CoddyKit 上的免费 Coding Interview Prep 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Coding Interview Prep 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Coding Interview Prep 课程共包含 4 节课。
原地删除重复值
给定一个已排序的数组,请在不使用额外数组的情况下为每个值保留一份副本。原地操作可以节省内存,也是经典的面试题。🧹
为什么排序有帮助
数组已排序时,每个重复值都会紧挨着它的另一个副本。因此您只需比较相邻元素,而不必比较整个数组。
两个角色,两个指针
使用一个慢指针标记最后一个保留的值,再使用一个快指针向前扫描,寻找尚未保留的新值。
slow = 0
fast = 1慢指针负责写入
可以将 slow 理解为写入位置:它所在位置及其之前的所有内容都已经清理完毕,并且没有重复值。
快指针负责读取
fast 指针只负责向前读取。它快速向前扫描,只有发现尚未保留的值时才通知 slow。
跳过重复项
如果 a[fast] 等于 a[slow],它就是重复项,因此只需将 fast 向前移动。重复值会被悄悄跳过。
for fast in range(1, n):
if a[fast] == a[slow]:
continue发现新值
当 a[fast] 不同时,将 slow 向前移动,并把新值复制到那里。这样就会用新的唯一数据覆盖旧的重复值。
else:
slow += 1
a[slow] = a[fast]答案就是长度
扫描结束后,slow + 1 就是唯一值的数量,它们都集中在数组的前端。
return slow + 1忽略尾部
唯一值前缀之后的内容都是多余数据。题目只关注前 slow + 1 个元素,因此保留尾部不变即可。
注意空数组
空数组包含零个唯一值。开始前请检查 n == 0,以免读取越过数组末尾。
if n == 0:
return 0一次扫描,不使用额外空间
这种慢指针与快指针的模式需要 O(n) 时间和 O(1) 额外空间,正好满足严格的内存限制。
快速检查
您正在使用慢指针和快指针,在已排序数组上原地删除重复值。
总结
在已排序数组上,慢指针与快指针可以在一次 O(n) 扫描中删除重复值且不使用额外空间,并返回 slow + 1 作为唯一值数量。🎉
常见问题解答
「原地删除重复项」课时是免费的吗?
是的 — 「原地删除重复项」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Coding Interview Prep 课程的其余内容,请升级到 CoddyKit PRO。 Coding Interview Prep 课程共包含 4 节课。
「原地删除重复项」这节课中我会学到什么?
使用一对慢指针和快指针 你通过在浏览器中直接运行的动手代码来练习 Coding Interview Prep,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Coding Interview Prep 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Coding Interview Prep 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「原地删除重复项」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Coding Interview Prep 课中编写并运行代码吗?
能。每节 Coding Interview Prep 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。