如何更高效地反转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); }
原实现的问题总结
- 额外创建
rowSizes和newData数组,浪费内存空间 - 两次嵌套循环复制元素,完全冗余——反转行不需要修改行内元素顺序,仅需调整行的顺序
- 手动循环复制元素的效率远低于JDK提供的native复制方法
内容的提问来源于stack exchange,提问作者newGuy77
相关产品推荐
相关产品推荐

