leetcode【中等】73、矩阵置零

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

注意:
不要使用额外空间

思路一:

  1. 使用第一行和第一列做标志位,代替额外空间记录哪一行哪一列要置零。
  2. 遍历数组,当遇到一个零,就把这个零所在的行列的第一个数设为零作为标记,最后再遍历一遍,将有标记的行列统一置零
  3. 注意:第一行第一列本身也可能有零,不仅仅是作为其他行列的标志位,所以额外用两个变量(空间复杂度o(1))记录是否有0
class Solution:
    def setZeroes(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """
        row=len(matrix)
        col=len(matrix[0])
        row_flag=col_flag=False

        #记录第一行第一列是否有零
        for i in range(row):
            if matrix[i][0]==0:
                col_flag=True
                break
        for j in range(col):
            if matrix[0][j]==0:
                row_flag=True
                break

        #从第二行第二列寻找零
        for i in range(1,row):
            for j in range(1,col):
                if matrix[i][j]==0:
                    matrix[i][0]=0
                    matrix[0][j]=0
        
        #将有标记的行列置零
        for i in range(1,row):
            for j in range(1,col):
                if matrix[i][0]==0 or matrix[0][j]==0:
                    matrix[i][j]=0

        #回头检查第一行第一列
        if row_flag:
            for j in range(col):
                matrix[0][j]=0
        if col_flag:
            for i in range(row):
                matrix[i][0]=0
class Solution {
    public void setZeroes(int[][] matrix) {
        int col=matrix[0].length,row=matrix.length;
        boolean row_flag=false,col_flag=false;
        for(int i=0;i<row;i++){
            if (matrix[i][0]==0){
                row_flag=true;
                break;
            }           
        }
        for(int i=0;i<col;i++){
            if (matrix[0][i]==0){
                col_flag=true;
                break;
            }
        }

        for(int i=1;i<row;i++){
            for(int j=1;j<col;j++){
                if( matrix[i][j]==0){
                    matrix[i][0]=0;
                    matrix[0][j]=0;
                }
            }
        }

        for(int i=1;i<row;i++){
            for(int j=1;j<col;j++){
                if(matrix[i][0]==0 || matrix[0][j]==0){
                    matrix[i][j]=0;
                }
            }
        }

        if(row_flag){
            for(int i=0;i<row;i++){
                matrix[i][0]=0;
            }
        }
        if(col_flag){
            for(int i=0;i<col;i++){
                matrix[0][i]=0;
            }
        }
    }
}

你可能感兴趣的:(leetcode,leetcode,算法,线性代数)