
本文介绍如何在 O(n) 时间复杂度内,仅用一次线性扫描,从升序排列的整数数组中准确提取所有出现次数大于 1 的元素,并去重输出——无需额外空间、不依赖哈希表,充分利用数组有序特性。
本文介绍如何在 o(n) 时间复杂度内,仅用一次线性扫描,从**升序排列的整数数组**中准确提取所有出现次数大于 1 的元素,并去重输出——无需额外空间、不依赖哈希表,充分利用数组有序特性。
在已排序数组中识别重复元素,核心优势在于:相同元素必然连续出现。因此,我们无需统计频次或使用哈希映射,只需一次从前到后的遍历,通过比较相邻元素即可高效判定重复性,并跳过冗余检查。
算法思路:
- 使用单指针
i从索引0开始遍历至n-2(因需访问arr[i+1]); - 若
arr[i] == arr[i+1],说明arr[i]至少出现两次,即为重复元素; - 为避免同一重复值被多次输出(例如
[4,4,4]中4仅输出一次),我们应在确认重复后,立即将指针跳至该重复段末尾,再继续后续检查。
以下是 Python 实现(兼顾可读性与边界处理):
n = int(input()) arr = list(map(int, input().split())) if n <p>✅ <strong>关键细节说明</strong>: </p>
while i 确保指针 <code>i停在最后一个连续相同元素的索引上,下一轮i += 1后即进入新值区域;- 每个重复值仅被添加一次到结果列表,天然满足“去重输出”要求;
- 时间复杂度严格为 O(n):每个元素最多被访问两次(一次主循环,一次内层跳过);
- 空间复杂度为 O(1)(不计输出存储),无哈希表、无递归栈。
⚠️ 注意事项:
- 输入规模可达 $10^5$,务必避免 $O(n^2)$ 解法(如嵌套循环逐个比对);
- 不要误用
set()或Counter—— 它们虽通用,但破坏了“有序”这一关键前提,且引入 $O(n)$ 额外空间及常数开销; - 特别注意边界:空数组或单元素数组直接输出
-1; - 输出格式必须为空格分隔的数字序列,无尾空格;若无重复,严格输出
-1(非空行或空字符串)。
该方法简洁、健壮、高效,是处理“有序数组重复检测”类问题的标准范式,适用于算法面试与工程场景中的轻量级数据清洗任务。










