七七老师の白日梦
首页项目归档照片墙音乐灵境说说杂谈友链关于
封面

矩阵置换:原地算法

写作时间:2026-07-11 11:45:37

给定一个 m x n 的矩阵,如果一个元素为 0 ,SADW则将其所在行和列的所有元素都设为 0 。请使用 原地 算法

是什么?

置零排序

怎么做?

原地算法

思考

原地算法,又看到这个词了,上次是原地哈希,有点亲切,这道题也不是很难,确定零的位置,然后像炸弹弹里的十字炸弹一样换零就可以了

代码

class Solution {
    public void setZeroes(int[][] matrix) {
        if (matrix == null || matrix.length == 0) return;
//        定义行列长度
        int m = matrix.length, n = matrix[0].length;
//        给后面的if语句使用
        boolean row0 = false, col0 = false;
//        配合if语句使用,判断这一行是否存在0
        for (int i = 0;i < m;i++) {
            if (matrix[i][0] == 0) col0 = true;
        }
//        同上,判断这一列是否存在0
        for (int j = 0;j < n;j++) {
            if (matrix[0][j] == 0) row0 = true;
        }
        // 使用第一行和第一列作为标记
        // 遍历矩阵内部元素(除第一行和第一列外),若当前元素为 0
        // 则将其所在行首和列首标记为 0
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                if (matrix[i][j] == 0) {
                    matrix[i][0] = 0;
                    matrix[0][j] = 0;
                }
            }
        }

        // 根据标记将元素置零
        // 遍历矩阵内部元素,若其所在行首或列首为 0
        // 则将该元素置为 0
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                if (matrix[i][0] == 0 || matrix[0][j] == 0) {
                    matrix[i][j] = 0;
                }
            }
        }

        // 处理第一行
        // 如果第一行中存在 0,则将第一行所有元素置零
        if (row0) {
            for (int i = 0; i <= n; i++) {
                matrix[0][i] = 0;
            }
        }

        // 处理第一列
        // 如果第一列中存在 0,则将第一列所有元素置零
        if (col0) {
            for (int i = 0; i <= m; i++) {
                matrix[i][0] = 0;
            }
        }

    }
}

‍

avatar

七七老师

分享代码日常

RECOMMENDED

七七旧事:复盘并改变写博客的方式

2026-07-02 22:54:38

字母异位词

2026-07-04 22:22:08

寻找两个正序数组的中位数:合并与二分

2026-07-08 15:56:26

Table of Contents