You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从有序列表高效获取唯一元素?求复杂度优于O(n)的方案

有序列表提取唯一值的高效方案分析

核心结论

对于有序列表的去重操作,不存在时间复杂度优于O(n)的解决方案。因为无论采用何种方法,都必须至少遍历一次列表,才能识别连续重复元素的边界——这是这类问题的理论时间下限,无法突破。

你的思路问题分析

你尝试的“隔一个元素检查”思路本身存在逻辑漏洞:连续重复元素的数量可能是奇数或偶数(比如示例中3出现3次),间隔检查会漏掉重复段的边界判断,再加上复杂的条件分支,很容易出现重复添加、漏加元素的问题(比如你的代码在处理[1,1,2,2,3]时会错误添加两次2)。

最优O(n)实现方案

既然无法突破O(n)的时间下限,我们可以实现时间O(n)、空间最优的去重逻辑,这已经是这类问题的最优解。以下是两种高效实现方式:

方法1:遍历记录前一个元素(简洁易读)

def get_unique_values(values):
    if not values:
        return []
    unique_list = [values[0]]
    for num in values[1:]:
        # 仅当当前元素与最后一个唯一元素不同时添加
        if num != unique_list[-1]:
            unique_list.append(num)
    return unique_list

方法2:双指针原地修改(空间更优)

如果不需要保留原列表,可以用双指针在原列表上修改,额外空间复杂度为O(1)(除返回结果外):

def get_unique_values(values):
    if not values:
        return []
    slow_ptr = 0
    for fast_ptr in range(1, len(values)):
        if values[fast_ptr] != values[slow_ptr]:
            slow_ptr += 1
            values[slow_ptr] = values[fast_ptr]
    # 截取到slow_ptr+1的位置,即为所有唯一元素
    return values[:slow_ptr+1]

方案效果验证

用你给出的示例列表[1,1,2,3,3,3,6,6,8,10,100,180,180]测试,两种方法都会返回预期结果:[1,2,3,6,8,10,100,180]。

内容的提问来源于stack exchange,提问作者Jack Skyblue

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 07:57:08