刷java算法题出现了空指针错误

发布于 2022-09-05 09:38:17 字数 903 浏览 10 评论 0

public class Solution {
    public void setZeroes(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        Boolean[] rows = new Boolean[m];
        Boolean[] cols = new Boolean[n];
        
        for(int i = 0; i< m; i++){
            for(int j = 0; j< n; j++){
                if(matrix[i][j] == 0){
                    rows[i] = true;
                    cols[j] = true;
                }
            }
        }
        for(int i = 0; i<m; i++){
            for(int j = 0; j< n; j++){
                if(rows[i] ==true || cols[j] == true)
                    matrix[i][j] = 0;   
            }
           
        }
    }
}

该题是leetcode第73题Set Matrix Zeroes,题目如下: Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
我的做法是,加一个行数组、一个列数组,来记录哪些行、哪些列有0,但是提交时出现了空指针错误。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

左岸枫 2022-09-12 09:38:17

你使用了Boolean定义你的M+N,默认初始化是null,换用boolean,默认初始化才是false。

然后解题思路优化上,题目提示了使用原地算法,
矩阵的第一行和第一列,其实是一个m+n,类似你的rows和cols。

优先判断第一行和第一列是否存在0,临时记录下
然后再判断x(x>0)行,y(y>0)列是否存在0,存在的更新他对应的第一行,第一列的值为0
最后根据临时的记录,和更新了的第一行第一列,更新整个矩阵,这样实际使用的额外空间,只有2个,是用来记录第一行和第一列是否存在0

謌踐踏愛綪 2022-09-12 09:38:17

你的 rows 是一个一维数组,cols 是另一个一维数组,一共可以保存 m + n 个数据。
但是下面用的是二重循环,那么一般应该是 m * n 个数据,所以,再思考一下。

又看了下题,你的定义是没错的,第一个二重循环找点也没错。不过后面设置 0 的时候就错了,应该分别按行和按列,使用两个二重循环来设置。一个是某行有 0 的时候,循环处理这一行的每一列,另一个是某列为 0 的时候,循环处理这一列的每一行……

给你一个 JS 的参考 (算法并非最优,但是相对较好理解)

/**
 * @param {number[][]} matrix
 * @return {void} Do not return anything, modify matrix in-place instead.
 */
var setZeroes = function(matrix) {
    const rowCount = matrix.length;
    const colCount = rowCount && matrix[0].length;

    const rowMarks = [];
    const colMarks = [];

    for (let i = 0; i < rowCount; i++) {
        for (let j = 0; j < colCount; j++) {
            if (matrix[i][j] === 0) {
                rowMarks[i] = true;
                colMarks[j] = true;
            }
        }
    }

    for (let i = 0; i < rowMarks.length; i++) {
        if (!rowMarks[i]) {
            continue;
        }

        for (let j = 0; j < colCount; j++) {
            matrix[i][j] = 0;
        }
    }

    for (let j = 0; j < colMarks.length; j++) {
        if (!colMarks[j]) {
            continue;
        }

        for (let i = 0; i < rowCount; i++) {
            matrix[i][j] = 0;
        }
    }
};
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文