[leetcode] 73.矩阵置零

本文介绍了一种矩阵置零的算法,旨在当矩阵中某个元素为0时,将其所在行和列的所有元素都设为0。文章提供了三种不同空间复杂度的解决方案,包括O(mn)、O(m+n)和O(1),并详细解释了每种方法的实现思路和代码示例。

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

矩阵置零

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

示例 1:

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

示例 2:

输入: 
[
  [0,1,2,0],
  [3,4,5,2],
  [1,3,1,5]
]
输出: 
[
  [0,0,0,0],
  [0,4,5,0],
  [0,3,1,0]
]

进阶:

  • 一个直接的解决方案是使用  O(mn) 的额外空间,但这并不是一个好的解决方案。
  • 一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
  • 你能想出一个常数空间的解决方案吗?

 

思路:o(mn)空间  第一遍遍历矩阵,用一个m*n的矩阵来记录矩阵中0的位置,再通过记录矩阵第二次遍历原始矩阵将行列置零。

o(m+n)空间 我的思路是用两个set集合,第一遍遍历的时候将0位置的行列分别记录到两个set集合中,第二次遍历时通过set集合置零。

o(1)空间 第一遍遍历矩阵时,如果第一行或者第一列有0元素,用两个flag(boolean)来记录,其余行列里如果有0元素则将矩阵的该行和列置零,第二遍扫描的时候如果matrix[0][i]或者matrix[j][0]为0,则令matrix[i][j]=0。

o(m+n):

class Solution {
    public void setZeroes(int[][] matrix) {
        Set<Integer> rowSet = new HashSet<>();
        Set<Integer> colSet = new HashSet<>();
        if(matrix.length<1) return;
        for(int i=0;i<matrix.length;i++){
            for(int j=0;j<matrix[0].length;j++){
                if(matrix[i][j]==0){
                    rowSet.add(i);
                    colSet.add(j);
                }
            }
        }
        for(int m:rowSet){
            for(int k=0;k<matrix[0].length;k++){
                matrix[m][k] = 0;
            }
        }
        for(int n:colSet){
            for(int k=0;k<matrix.length;k++){
                matrix[k][n] = 0;
            }
        }
    }
}

 

o(1):

//         if(matrix.length<1) return;
//         boolean firstRowIsZero = false;
//         boolean firstColIsZero = false;
        
//         for(int i=0;i<matrix.length;i++){
//             for(int j=0;j<matrix[0].length;j++){
//                 if(i!=0&&j!=0&&matrix[i][j]==0){
//                     matrix[0][j] = 0;
//                     matrix[i][0] = 0;
//                 }else if(matrix[i][j]==0){
//                     firstRowIsZero = i==0?true:firstRowIsZero;
//                     firstColIsZero = j==0?true:firstColIsZero;
//                 }
                    
                
//             }
//         }
        
//         for(int i=0;i<matrix.length;i++){
//             for(int j=0;j<matrix[0].length;j++){
//                 if(matrix[0][j]==0 || matrix[i][0]==0){
//                     matrix[i][j] = 0;
//                 }
//             }
//         }
        
//         if(firstRowIsZero){
//             for(int i=0;i<matrix[0].length;i++){
//                 matrix[0][i] = 0;
//             }
//         }
        
//         if(firstColIsZero){
//             for(int i=0;i<matrix.length;i++){
//                 matrix[i][0] = 0;
//             }
//         }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值