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

循环单独正常组合失效: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 01:06:26