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

C++中检测长int数组是否存在重复元素的最快方法是什么?

C++ 检测长int数组重复元素的高性能方案

针对极长int数组的重复检测,根据不同的约束条件,有三种性能优异的方案可选,均远优于O(n²)的暴力嵌套遍历:

1. 位图/布尔数组方案(性能天花板,适用元素范围有限场景)

如果数组元素的取值范围可控(例如所有元素为非负整数,且最大值不超过1e7级别),该方案是最优选择,时间复杂度O(n),空间复杂度O(maxVal),无额外计算开销,访问完全连续缓存友好。

示例代码:

#include <vector>
bool has_duplicate(const std::vector<int>& arr, int max_element_val) {
    std::vector<bool> visited(max_element_val + 1, false);
    for (int num : arr) {
        if (visited[num]) return true;
        visited[num] = true;
    }
    return false;
}

2. 排序后相邻校验方案(性能最稳定,适用允许修改原数组场景)

如果元素取值范围不确定,但允许修改原数组,优先选择该方案,时间复杂度O(nlogn),空间复杂度O(1)(原地排序无额外空间开销)。STL的std::sort做了高度优化,且连续内存访问缓存命中率极高,实际运行性能通常比哈希方案更稳定,不会出现哈希冲突导致的最坏情况。

示例代码:

#include <vector>
#include <algorithm>
bool has_duplicate(std::vector<int>& arr) {
    if (arr.size() <= 1) return false;
    std::sort(arr.begin(), arr.end());
    for (size_t i = 1; i < arr.size(); ++i) {
        if (arr[i] == arr[i - 1]) return true;
    }
    return false;
}

如果不允许修改原数组,需要额外复制一份数组,此时空间复杂度变为O(n),性价比低于哈希方案。

3. 哈希集合方案(适用不允许修改原数组、元素范围不确定场景)

该方案平均时间复杂度O(n),空间复杂度O(n),不需要修改原数组,适用场景最广泛。注意需要预分配集合空间避免扩容开销,进一步提升性能。

示例代码:

#include <vector>
#include <unordered_set>
bool has_duplicate(const std::vector<int>& arr) {
    std::unordered_set<int> visited;
    visited.reserve(arr.size()); // 预分配空间,避免多次扩容损耗性能
    for (int num : arr) {
        if (visited.count(num)) return true;
        visited.insert(num);
    }
    return false;
}

内容的提问来源于stack exchange,提问作者new Q Open Wid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 14:09:03