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

查找数组重复元素的Java代码超时问题求助

问题分析与修复方案

超时核心原因

你的代码超时主要是因为**arrList.contains(arr[i])的高时间开销**:ArrayList的contains方法是线性遍历查找,时间复杂度为O(k)(k为当前列表长度)。当数组规模较大时,循环中频繁调用这个方法会让整体时间复杂度从排序的O(n log n)恶化到O(n²),触发超时。

另外代码还有两个隐藏问题:

  • 数组越界:循环条件i < n会导致当i = n-1时,arr[i+1]访问超出数组范围,抛出ArrayIndexOutOfBoundsException
  • 拼写错误:Arraylist应该是ArrayList(Java类名大小写敏感)

修复后的代码

利用数组排序后重复元素连续的特性,直接判断当前元素是否和下一个元素重复,且仅在第一次遇到该重复元素时添加,完全避免contains调用:

import java.util.ArrayList;
import java.util.Arrays;

public static ArrayList<Integer> duplicates(int arr[], int n) {
    ArrayList<Integer> arrList = new ArrayList<>();
    Arrays.sort(arr);
          
    for(int i = 0; i < n - 1; i++) {
        // 仅当当前元素等于下一个,且要么是第一个元素,要么和前一个元素不同时添加
        if(arr[i] == arr[i+1]) {
            if(i == 0 || arr[i] != arr[i-1]) {
                arrList.add(arr[i]);
            }
        }
    }
    
    if(arrList.isEmpty()) {
        arrList.add(-1);
    }
    
    return arrList;
}

优化说明

  1. 循环条件改为i < n-1,彻底避免数组越界问题
  2. 去掉contains调用,通过判断当前元素与前一个元素是否不同,确保每个重复元素只被添加一次,整体时间复杂度回到O(n log n)(排序的时间),遍历过程为O(n),效率大幅提升
  3. 修正了Arraylist的拼写错误,保证代码能正常编译

内容的提问来源于stack exchange,提问作者H3_119 Shinde Siddhesh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 03:50:27