leetcode-73.矩阵置零-day5

java 复制代码
class Solution {
    public void setZeroes(int[][] mat) {
        int m = mat.length, n = mat[0].length;
        // 1. 扫描「首行」和「首列」记录「首行」和「首列」是否该被置零
        boolean r0 = false, c0 = false;
        for (int i = 0; i < m; i++) {
            if (mat[i][0] == 0) {
                r0 = true;
                break;
            }
        }
        for (int j = 0; j < n; j++) {
            if (mat[0][j] == 0) {
                c0 = true;
                break;
            }
        }
        // 2.1 扫描「非首行首列」的位置,如果发现零,将需要置零的信息存储到该行的「最左方」和「最上方」的格子内
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                if (mat[i][j] == 0) mat[i][0] = mat[0][j] = 0;
            }
        }
        // 2.2 根据刚刚记录在「最左方」和「最上方」格子内的置零信息,进行「非首行首列」置零
        for (int j = 1; j < n; j++) {
            if (mat[0][j] == 0) {
                for (int i = 1; i < m; i++) mat[i][j] = 0;
            }
        }
        for (int i = 1; i < m; i++) {
            if (mat[i][0] == 0) Arrays.fill(mat[i], 0);
        }
        // 3. 根据最开始记录的「首行」和「首列」信息,进行「首行首列」置零
        if (r0) for (int i = 0; i < m; i++) mat[i][0] = 0;
        if (c0) Arrays.fill(mat[0], 0);
    }
}

自己实现:

java 复制代码
public void setZeroes(int[][] matrix) {
        /*思路:
        * 1.如果先操作前面的元素则会对后面元素覆盖从而造成影响,则可以考虑存储。
        * 2.采取原地O(1)操作,则可以考虑存储到行首和列首
        * 3.特殊情况,只有一行或一列
        * 4.注意[0][0]这个相交位置
        * */
        boolean rowHead = false;
        boolean columnHead = false;

        int r = matrix.length;
        int c = matrix[0].length;
        for (int i = 0; i < r; i++) {
            if (matrix[i][0] == 0) {
                rowHead = true;
            }
        }
        for (int i = 0; i < c; i++) {
            if (matrix[0][i] == 0) {
                columnHead = true;
            }
        }
        //要考虑特殊情况
        if(r>=2&&c>=2){
            for (int i = 0; i < r; i++) {
                for (int j = 1; j < c; j++) {
                    if(matrix[i][j]==0){
                        matrix[i][0]=0;
                        matrix[0][j]=0;
                    }
                }
            }
        }
        //注意开始扫描行首和列首时,i,j应该从1开始,不然会影响后续判断(跳过[0][0])
        for (int j = 1; j < c; j++) {
            if(matrix[0][j]==0){
                for (int i = 0; i < r; i++) {
                    matrix[i][j]=0;
                }
            }
        }
        for (int i = 1; i < r; i++) {
            if(matrix[i][0]==0){
                for (int j = 0; j < c; j++) {
                    matrix[i][j]=0;
                }
            }
        }

        if(rowHead){
            for (int i = 0; i < r; i++) {
                matrix[i][0]=0;
            }
        }
        if(columnHead){
            for (int i = 0; i < c; i++) {
                matrix[0][i]=0;
            }
        }
    }
相关推荐
m0_7400437321 小时前
SpringBoot02-SpringMVC入门
java·开发语言·spring boot·spring·mvc
Seven9721 小时前
字符串匹配算法
java
代码游侠21 小时前
学习笔记——Linux内核链表
linux·运维·笔记·学习·算法·链表
sheeta199821 小时前
LeetCode 每日一题笔记 日期:2025.12.14 题目:2147.分隔长廊的方案数
linux·笔记·leetcode
ss27321 小时前
阻塞队列:生产者-消费者模式
java·开发语言
艾莉丝努力练剑21 小时前
【Linux进程(一)】深入理解计算机系统核心:从冯·诺依曼体系结构到操作系统(OS)
java·linux·运维·服务器·git·编辑器·操作系统核心
阿蒙Amon21 小时前
JavaScript学习笔记:8.日期和时间
javascript·笔记·学习
guslegend21 小时前
SpringBoot 缓存深入
java
暗然而日章21 小时前
C++基础:Stanford CS106L学习笔记 10 函数模板(Function Templates)
c++·笔记·学习
swan41621 小时前
SCAU期末笔记 - 实时计算框架章末实验
笔记