LeetCode—set-matrix-zeroes(矩阵置0)—java

本文介绍了一种高效的矩阵置零算法,该算法能在原地修改矩阵,当矩阵中某个元素为0时,将其所在行和列全部置零。文章详细解析了算法思路,并提供了一个具体的Java实现案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.

click to show follow up.

Follow up:

Did you use extra space?
A straight forward solution using O(m n) space is probably a bad idea.
A simple improvement uses O(m + n) space, but still not the best solution.
Could you devise a constant space solution?

思路解析

  • 题意:矩阵的第i行和第j列的元素为0,那么第i行全部设置为0,第j列全部设置为0
  • 首先记录矩阵的行和列.
  • 然后先把第一行和第一列记录下是否要置为0,可以用Boolean类型的记录
  • 检查每个元素,除了第一行和第一列,只要为0,就让第一行和第一列记录一下置0情况
  • 然后遍历每个元素,根据第一行和第一列的记录情况,执行置0操作
  • 最后再根据第一行和第一列的置0情况,把第一行和第一列置0,如果不需要就保持原来的样子就可以了
  • 当时有点疑问,如果第j列只有第0行的元素是0,其他都是1的话,第j列那就不置0了吗,那不就错了吗?后来在提示下,他本来就是0了,已经记录下了,所以他不用修改为0,就是0 了,所以第j列还是会置0的。为自己智商捉急。。。。。

代码

public class Solution {
    public void setZeroes(int[][] matrix) {
        int rownum = matrix.length;
        if(rownum==0) return ;
        int colnum = matrix[0].length;
        if(colnum==0) return;
        boolean hasZeroFirstRow = false,hasZeroFirstColumn=false;
        //遍历第0列的所有行,只要有一个是0,第一列就是0,先记录下
        for(int i=0;i<rownum;i++){
            if(matrix[i][0]==0){
                hasZeroFirstColumn = true;
                break;
            }
        }
        //遍历第0行的每个列,只要有一个是0,第一行就是0,先记录下
        for(int j=0;j<colnum;j++){
            if(matrix[0][j]==0){
                hasZeroFirstRow = true;
                break;
            }
        }
        //matrix[0][j]是记录第j列是可以置0的;matrix[i][0]是记录第i行是可以置0的
        for(int i=1;i<rownum;i++){
            for(int j=1;j<colnum;j++){
                if(matrix[i][j]==0){
                    matrix[0][j]=0;
                    matrix[i][0]=0;
                }
            }
        }
        //把对应的行和列置0,除了第一行和第一列
        for(int i=1;i<rownum;i++){
            for(int j=1;j<colnum;j++){
                if(matrix[i][0]==0||matrix[0][j]==0){
                    matrix[i][j]=0;
                }
            }
        }
        //把第一行置0
        if(hasZeroFirstRow){
            for(int j=0;j<colnum;j++){
                matrix[0][j]=0;
            }
        }
        //把第一列置0
        if(hasZeroFirstColumn){
            for(int i=0;i<rownum;i++){
                matrix[i][0]=0;
            }
        }
    }
}
参考:https://blog.youkuaiyun.com/linhuanmars/article/details/24066199/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值