力扣经典算法篇-42-矩阵置零(辅助数组标记法,使用两个标记变量)

1、题干

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

示例 1:

输入:matrix = \[1,1,1,1,0,1,1,1,1]

输出:\[1,0,1,0,0,0,1,0,1]

示例 2:

输入:matrix = \[0,1,2,0,3,4,5,2,1,3,1,5]

输出:\[0,0,0,0,0,4,5,0,0,3,1,0]

提示:

m == matrix.length

n == matrix0.length

1 <= m, n <= 200

-231 <= matrixij <= 231 - 1

2、解题

本题要求,遍历元素,发现为0的元素时,将其列和行均变为0;

注意不能在遍历的过程中同步进行0值的修改。想一下,如果在遍历时就将后面行的元素修改成了0,那么之后行的遍历时,就会将改行全部变为0,进而导致整个列也全部都变成0,最终形成全0的局面。

方法一:(辅助数组标记法)

在第一次遍历数据时,使用辅助数组记住0元素的下标位置。在第二次遍历时,将根据辅助数组的标记进行修改。

代码示例:

java 复制代码
import java.util.Arrays;

public class Test48 {

    public static void setZeroes(int[][] matrix) {
        int rowLen = matrix.length;
        int colLen = matrix[0].length;
        boolean[] hasRow = new boolean[rowLen];     // 辅助数组,记录为0的行
        boolean[] hasCol = new boolean[colLen];     // 辅助数组,记录为0的列
        for (int i = 0; i < rowLen; i++) {
            for (int j = 0; j < colLen; j++) {
                if (matrix[i][j]==0){       // 第一次遍历,填充辅助数组
                    hasRow[i] = true;
                    hasCol[j] = true;
                }
            }
        }

        for (int i = 0; i < rowLen; i++) {
            for (int j = 0; j < colLen; j++) {
                if (hasRow[i] || hasCol[j]){     // 第二次遍历,根据辅助数组进行数据的修改
                    matrix[i][j]=0;
                }
            }
        }
    }

    public static void main(String[] args) {
        int[][] matrix = {{1, 1, 1}, {1, 0, 1}, {1, 1, 1}};
        setZeroes(matrix);
        System.out.println(Arrays.deepToString(matrix));
    }
}

方法二:(使用两个标记变量)

使用两个变量标记。实际上是方法一节省空间的一种表现。

将第0行和第0列作为辅助空间,先标记在修改元素。但第0行和第0列的元素不能根据被修改后的值进行修改,所以还要添加两个变量先记录第0行和第0列是否包含0的存在。

逻辑顺序:

(1)、先判断第0行和第0列是否包含0,生成对应的标记。

(2)、遍历之后非0行和非0列的元素,使用第0行和第0列作为辅助空间,进行标记。

(3)、再次遍历非0行和非0列的元素,使用第0行和第0列辅助数组空间进行值的修改。

(4)、使用第0行和第0列的标记,对第0行和第0列的元素进行修改。

代码示例:

java 复制代码
import java.util.Arrays;

public class Test48 {

    public static void setZeroes(int[][] matrix) {
        int rowLen = matrix.length;
        int colLen = matrix[0].length;

        boolean isFirstRow = false;      // 第0行是否包含0。这里使用第0行作为行辅助空间,进行后续元素的修改参照,最后在根据第0行单独的标记进行该行的修改。
        boolean isFirstCol = false;      // 第0列是否包含0。这里使用第0列作为列辅助空间,进行后续元素的修改参照,最后在根据第0列单独的标记进行该列的修改。
        for (int i = 0; i < colLen; i++) {       
            if (matrix[0][i]==0){              // 第0行是否包含0遍历处理
                isFirstRow = true; 
                break;
            }
        }
        for (int i = 0; i < rowLen; i++) {
            if (matrix[i][0]==0){              // 第0列是否包含0遍历处理
                isFirstCol = true;
                break;
            }
        }

        // 遍历之后的元素,使用第0行和第0列作为辅助数组标记
        for (int i = 1; i < rowLen; i++) {
            for (int j = 1; j < colLen; j++) {
                // 先标记 
                if(matrix[i][j]==0){
                    matrix[0][j] = 0;
                    matrix[i][0] = 0;
                }
            }
        }
        for (int i = 1; i < rowLen; i++) {
            for (int j = 1; j < colLen; j++) {
                // 根据标记在进行元素修改
                if(matrix[i][0]==0 || matrix[0][j]==0){
                    matrix[i][j] = 0;
                }
            }
        }
        
		// 根据第0行和第0列的标记,进行第0行和第0列的修改
        if (isFirstRow){
            for (int i = 0; i < colLen; i++) {
                matrix[0][i] = 0;
            }
        }
        if (isFirstCol){
            for (int i = 0; i < rowLen; i++) {
                matrix[i][0] = 0;
            }
        }
    }

    public static void main(String[] args) {
        int[][] matrix = {{1, 1, 1}, {1, 0, 1}, {1, 1, 1}};
        setZeroes(matrix);
        System.out.println(Arrays.deepToString(matrix));
    }
}

向阳前行,Dare To Be!!!

相关推荐
洛水水22 分钟前
【力扣100题】76.搜索插入位置
数据结构·算法·leetcode
Techblog of HaoWANG25 分钟前
智巡守卫:多模态巡检智能体算法服务端设计与实现——基于Ollama+Qwen3.5的自动化巡检报告生成系统
运维·人工智能·算法·目标检测·自动化·边缘计算
小蒋学算法36 分钟前
算法-灌溉花园的最少龙头数目-贪心
算法
满怀冰雪36 分钟前
第07篇-差分算法-高效处理区间修改问题
数据结构·算法
KaMeidebaby38 分钟前
卡梅德生物技术快报|重组蛋白的表达和纯化:工艺调试全记录:大肠杆菌体系重组蛋白的表达和纯化参数标定(肠激酶轻链案例)
前端·人工智能·算法·数据挖掘·数据分析
ZPC82101 小时前
如何将机械臂末端定位精度提升至微米如何进行标定
人工智能·算法·机器人
wabs6661 小时前
关于动态规划【力扣343.整数拆分的递推公式怎么理解?】
算法·leetcode·动态规划
测试狗科研平台1 小时前
第一性原理CO2还原反应计算流程和软件推荐
科技·算法·云计算
SEO_juper1 小时前
2026 谷歌 SEO&GEO 常见问题合集:收录、排名、内容、技术全解析
算法·谷歌·常见问题·seo·跨境电商·外贸·geo
叫我:松哥1 小时前
基于卷积神经网络的静态手势语识别算法,在测试集上的识别准确率达到97.5%
人工智能·python·深度学习·神经网络·算法·cnn