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

如何更高效地反转Java中的不规则二维数组行?

优化Java不规则二维数组行反转的实现

你的原实现存在大量冗余操作,比如额外创建数组、重复复制元素,导致效率偏低。其实反转不规则二维数组的行,核心是调整行的顺序,而二维数组的每一行是独立的一维数组引用,直接交换行引用就能完成反转,这是效率最高的方案。

最优实现(原地反转,无元素复制)

这个方案时间复杂度为O(m)(m是数组行数),空间复杂度O(1),仅用一个临时变量存储引用:

public static void flipMatRows(int[][] data) {
    if (data == null || data.length <= 1) {
        printMat(data);
        return;
    }
    int left = 0;
    int right = data.length - 1;
    while (left < right) {
        // 直接交换首尾行的引用
        int[] temp = data[left];
        data[left] = data[right];
        data[right] = temp;
        left++;
        right--;
    }
    printMat(data);
}

如果需要返回新数组(不修改原数组)

如果不想改变原数组的引用,而是生成一个反转后的新数组,同样不需要复制元素,直接逆序赋值行引用即可:

public static int[][] flipMatRows(int[][] data) {
    if (data == null) {
        return null;
    }
    int[][] reversed = new int[data.length][];
    for (int i = 0; i < data.length; i++) {
        reversed[i] = data[data.length - 1 - i];
    }
    printMat(reversed);
    return reversed;
}

特殊场景:需要复制行内元素(不共享引用)

如果业务要求必须创建行元素的副本(避免后续修改原数组行影响反转后的数组),可以用Arrays.copyOf替代手动循环复制,它底层是native实现,比Java层循环更快:

import java.util.Arrays;

public static void flipMatRows(int[][] data) {
    if (data == null || data.length <= 1) {
        printMat(data);
        return;
    }
    int left = 0;
    int right = data.length - 1;
    while (left < right) {
        // 复制行元素,而非交换引用
        int[] leftCopy = Arrays.copyOf(data[left], data[left].length);
        int[] rightCopy = Arrays.copyOf(data[right], data[right].length);
        data[left] = rightCopy;
        data[right] = leftCopy;
        left++;
        right--;
    }
    printMat(data);
}

原实现的问题总结

  1. 额外创建rowSizes和newData数组,浪费内存空间
  2. 两次嵌套循环复制元素,完全冗余——反转行不需要修改行内元素顺序,仅需调整行的顺序
  3. 手动循环复制元素的效率远低于JDK提供的native复制方法

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 11:37:29