如果面试官在“数组里找重复数字”这道题上继续追问,最常见的升级条件就是:不能修改原数组。这时,原地置换思路就不能直接用了,需要换一种不破坏输入的做法。
为什么原地方法这时不适用
原地置换依赖不断交换元素,让数字回到自己对应的下标位置。它的优势是省空间,但代价是会直接改写原数组。一旦题目明确禁止修改输入,这条路就应该立刻放弃。
最直接的解法是用额外集合
如果题目没有限制额外空间,最容易解释也最稳定的方案就是用 HashSet。遍历数组时,先判断当前数字是否已经出现过;出现过就返回重复值,没有就加入集合。这个做法时间复杂度是 O(n),空间复杂度也是 O(n)。
如果还想继续压缩空间怎么办
有些面试会进一步追问:既不能改原数组,又想少用额外空间。这时可以考虑基于取值范围做二分统计。做法不是对数组排序,而是对“数字范围”做二分,每次统计某个区间里元素出现的次数。如果次数超过区间容量,重复数字就在这个区间里。
这种方法的时间复杂度通常是 O(n log n),空间复杂度可以做到 O(1),代价是实现和解释都更绕一些。
面试里怎么选择更合适
如果题目只强调“不改原数组”,优先给出 HashSet 往往最稳。只有当面试官继续追问空间复杂度,才有必要补充基于范围统计的二分思路。先给稳定答案,再展示进阶能力,通常比一上来就讲复杂做法更清楚。
结论
不能改原数组时,首选思路通常是 HashSet;如果还要继续压空间,再考虑基于数值范围的二分统计。关键是先看题目限制,不要把原地置换硬套进去。
正文完




