循环单独正常组合失效:LeetCode矩阵置零代码问题求助
矩阵置零问题的错误原因分析
我是编程新手,正在解决LeetCode的「矩阵置零」问题。
我的错误代码
class Solution { public void setZeroes(int[][] matrix) { int [][] arr = matrix; for(int m=0;m<matrix.length;m++) { for(int n = 0;n<matrix[m].length;n++) { if(matrix[m][n] == 0) { //循环1:垂直置零 for(int i = 0; i<matrix.length;i++) { arr[i][n] = 0; } //循环2:水平置零 for(int i = 0; i<matrix[m].length;i++) { arr[m][i] = 0; } } } } matrix = arr; } }
正确参考代码
class Solution { public void setZeroes(int[][] matrix) { //声明新的二维数组 int[][] arr = new int[matrix.length][matrix[0].length]; //将matrix的值复制到新数组arr中 for(int i = 0; i<matrix.length;i++) { for(int j = 0; j<matrix[i].length;j++) { arr[i][j] = matrix[i][j]; } } for(int m=0;m<matrix.length;m++) { for(int n = 0;n<matrix[m].length;n++) { if(matrix[m][n] == 0) { for(int i = 0; i<matrix.length;i++) { arr[i][n] = 0; } for(int i = 0; i<matrix[m].length;i++) { arr[m][i] = 0; } } } } for(int i = 0; i<matrix.length;i++) { for(int j = 0; j<matrix[i].length;j++) { matrix[i][j] = arr[i][j]; } } } }
遇到的问题
这两个for循环单独运行时均可正常工作(移除循环1则循环2正常,移除循环2则循环1正常),循环1负责将对应列垂直置零,循环2负责将对应行水平置零,但同时运行时就无法正确执行。想请教这一问题的原因是什么?
问题原因分析
核心问题出在数组引用的赋值上:
- 你写的
int [][] arr = matrix;并没有创建新数组,只是让arr和matrix指向了内存中的同一个二维数组对象。 - 当你在循环1中修改
arr[i][n] = 0时,本质上是直接修改了原matrix数组的内容。 - 后续遍历到这些被新置零的元素时,会再次触发置零逻辑,导致原本不需要置零的行/列也被错误置零,最终结果混乱。
而正确代码中:
- 通过
new int[matrix.length][matrix[0].length]创建了一个全新的数组,然后把原矩阵的值完整复制过去。 - 遍历原矩阵找零的位置,修改的是新数组
arr,原矩阵matrix的内容不会被中途修改,避免了遍历过程中触发额外的置零操作。 - 最后再把修改好的新数组的值复制回原矩阵,得到正确结果。
另外,你最后写的matrix = arr;在Java里也无效,因为方法参数是值传递,修改参数变量的引用不会影响外部原数组的指向,必须逐个元素赋值才能修改原数组内容。
内容的提问来源于stack exchange,提问作者Utkarsh Dogra
相关产品推荐
相关产品推荐

