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

给定整数数组,如何以O(nlog(n))复杂度判断是否存在等值元素?

O(nlogn)复杂度判断数组中是否存在重复元素的实现方案

核心思路

利用排序算法的O(nlogn)时间复杂度特性,排序后相同元素会相邻,只需一次线性遍历即可检测重复,整体时间复杂度为O(nlogn)。

具体实现步骤

  • 排序数组:使用编程语言内置的O(nlogn)排序算法(如快速排序、归并排序)对目标数组进行排序,这一步是复杂度的主要来源。
  • 遍历检查相邻元素:遍历排序后的数组,逐一比较当前元素与下一个元素是否相等。若发现相等元素,直接返回存在重复;遍历结束未发现则返回不存在。

代码示例

Python 实现

def has_duplicate(nums):
    sorted_nums = sorted(nums)
    for i in range(len(sorted_nums) - 1):
        if sorted_nums[i] == sorted_nums[i + 1]:
            return True
    return False

Java 实现

import java.util.Arrays;

public class DuplicateChecker {
    public static boolean hasDuplicate(int[] nums) {
        Arrays.sort(nums);
        for (int i = 0; i < nums.length - 1; i++) {
            if (nums[i] == nums[i + 1]) {
                return true;
            }
        }
        return false;
    }
}

另一种实现思路:平衡二叉搜索树

通过平衡二叉搜索树(如Java的TreeSet)存储元素,插入每个元素前检查是否已存在。插入和查找操作的时间复杂度均为O(logn),n个元素的总复杂度为O(nlogn)。

Java 示例

import java.util.TreeSet;

public class DuplicateChecker {
    public static boolean hasDuplicate(int[] nums) {
        TreeSet<Integer> set = new TreeSet<>();
        for (int num : nums) {
            // add方法返回false表示元素已存在
            if (!set.add(num)) {
                return true;
            }
        }
        return false;
    }
}

复杂度说明

排序方案中,排序操作占O(nlogn),遍历占O(n),整体时间复杂度由排序主导,为O(nlogn);平衡二叉搜索树方案中,n次O(logn)的插入/检查操作,总复杂度同样为O(nlogn),均满足需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 05:16:08