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

如何高效判断两个数组是否相似(最多允许交换1对元素)

数组相似性判断代码优化方案

原代码性能瓶颈

现有代码的核心耗时来自两次Arrays.sort()排序操作,时间复杂度为O(n log n),处理大长度数组时排序开销会急剧上升,是拖慢执行速度的主要原因。

优化思路

完全移除排序步骤,改为单次遍历完成判断,时间复杂度降到O(n),逻辑如下:

  • 前置判断:两个数组长度不一致直接返回false
  • 遍历数组时统计不相等的元素个数,同时记录前两处不相等的索引位置
  • 不相等个数为0:数组本身完全相同,返回true
  • 不相等个数不等于2:单次交换最多只能修正2个位置的不匹配,直接返回false
  • 不相等个数恰好为2:校验两个位置的元素是否交叉相等(即a的第一个不同元素等于b的第二个不同元素,a的第二个不同元素等于b的第一个不同元素),满足则返回true,否则返回false

优化后代码

boolean checkSimilarArray(int[] a, int[] b) {
    // 前置判断长度是否一致
    if (a.length != b.length) {
        return false;
    }
    int diffCount = 0;
    int firstDiffIdx = -1, secondDiffIdx = -1;
    for (int i = 0; i < a.length; i++) {
        if (a[i] != b[i]) {
            diffCount++;
            // 超过2个不同直接提前返回,无需继续遍历
            if (diffCount > 2) {
                return false;
            }
            if (diffCount == 1) {
                firstDiffIdx = i;
            } else {
                secondDiffIdx = i;
            }
        }
    }
    // 没有不同直接返回true
    if (diffCount == 0) {
        return true;
    }
    // 仅2个不同的场景校验交叉相等
    return a[firstDiffIdx] == b[secondDiffIdx] && a[secondDiffIdx] == b[firstDiffIdx];
}

性能提升说明

优化后代码仅需一次遍历,且遇到超过2个不同的场景可以提前终止遍历,无需额外的排序、全量数组对比操作,哪怕处理百万级长度的数组,耗时也能控制在毫秒级,完全满足3秒以内的要求。

内容的提问来源于stack exchange,提问作者Hào Nguyễn Hưng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 21:57:00