矩阵遇零值替换为邻值和且相邻元素置零的优化方案求助
矩阵零值元素处理优化实现
核心优化点
- 采用方向偏移量数组统一处理边界/内部元素的相邻元素遍历,完全消除原代码中重复的多分支边界判断逻辑,代码更简洁易维护,天然适配任意大小的矩阵(支持1行N列、N行1列、1x1等所有规格)
- 保留原实现的正确逻辑:先遍历所有零值元素计算替换值并记录坐标,再统一将对应相邻元素置零,避免中间修改矩阵影响后续零值元素的计算结果
- 减少不必要的装箱拆箱操作,使用基础类型数组存储零值坐标,运行效率更高
优化后完整代码
import java.util.ArrayList; import java.util.List; public class Main { // 上下左右四个方向的偏移量 private static final int[][] DIRS = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; static void MakeZeroes(int[][] matrix) { // 空矩阵直接返回 if (matrix == null || matrix.length == 0 || matrix[0].length == 0) { return; } int rows = matrix.length; int cols = matrix[0].length; List<int[]> zeroPositions = new ArrayList<>(); // 第一轮遍历:计算零值元素的替换值,同时记录零值坐标 for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { if (matrix[i][j] == 0) { int sum = 0; // 遍历四个方向累加合法相邻元素的值 for (int[] dir : DIRS) { int x = i + dir[0]; int y = j + dir[1]; if (x >= 0 && x < rows && y >= 0 && y < cols) { sum += matrix[x][y]; } } matrix[i][j] = sum; zeroPositions.add(new int[]{i, j}); } } } // 第二轮遍历:将所有零值元素的相邻元素置零 for (int[] pos : zeroPositions) { int i = pos[0]; int j = pos[1]; for (int[] dir : DIRS) { int x = i + dir[0]; int y = j + dir[1]; if (x >= 0 && x < rows && y >= 0 && y < cols) { matrix[x][y] = 0; } } } } public static void main(String[] args) { int[][] matrix = {{2,0,4,0}, {5,9,7,9}, {2,0,8,0}}; MakeZeroes(matrix); // 打印结果 for (int i = 0; i < matrix.length; i++) { for (int j = 0; j < matrix[i].length; j++) { System.out.print(matrix[i][j] + " "); } System.out.println(); } } }
使用说明
直接修改main函数中matrix变量的取值即可测试任意规格矩阵,运行结果和原实现完全一致,同时兼容边缘规格矩阵的处理。
内容的提问来源于stack exchange,提问作者Aryaman
相关产品推荐
相关产品推荐

