leetcode——73.矩阵置零

思路

  1. 遍历矩阵,记录矩阵每行每列应该是0还是1
  2. 通过 标记数组 \ 标记变量 进行矩阵原地更新

收获

空间效率的提升思路

  1. 使用两个标记数组
  2. 使用两个标记变量判断原矩阵第一行第一列 借用原矩阵第一行第一列为标记数组
  3. 使用一个标记变量判断原矩阵第一列 利用起原矩阵的对角[0,0]

代码1(使用标记数组)

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        int m = matrix.size();
        int n = matrix[0].size();
        //申请两个数组标记数组 若干行 若干列 是否标记为0
        vector<int> row(m), col(n);
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (!matrix[i][j]) {
                    row[i] = col[j] = true;
                }
            }
        }
        //根据得到的标记数组 更新 原数据
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (row[i] || col[j]) {
                    matrix[i][j] = 0;
                }
            }
        }
    }
};

代码2:使用两个标记变量

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        int m = matrix.size();
        int n = matrix[0].size();
        int flag_col0 = false, flag_row0 = false;
        //判断第一列是否该为0
        for (int i = 0; i < m; i++) 
            if (!matrix[i][0]) 
                flag_col0 = true;
        //判断第一行是否该为0
        for (int j = 0; j < n; j++) 
            if (!matrix[0][j]) 
                flag_row0 = true;
            
        //使用矩阵第一列第一行作为标记数组
        for (int i = 1; i < m; i++) 
            for (int j = 1; j < n; j++) 
                if (!matrix[i][j]) 
                    matrix[i][0] = matrix[0][j] = 0;
        //根据标记数组进行原地矩阵更新
        for (int i = 1; i < m; i++) 
            for (int j = 1; j < n; j++) 
                if (!matrix[i][0] || !matrix[0][j]) 
                    matrix[i][j] = 0;

        //根据变量修改矩阵第一列 第一行的数据
        if (flag_col0) 
            for (int i = 0; i < m; i++) 
                matrix[i][0] = 0;
        if (flag_row0) 
            for (int j = 0; j < n; j++) 
                matrix[0][j] = 0;
    }
};

代码3:使用一个标记变量

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        int m = matrix.size();
        int n = matrix[0].size();
        int flag_col0 = false;
        
        for (int i = 0; i < m; i++) {
            //标记矩阵第一列变量
            if (!matrix[i][0]) 
                flag_col0 = true;
            //标记矩阵
            for (int j = 1; j < n; j++) 
                if (!matrix[i][j]) 
                    matrix[i][0] = matrix[0][j] = 0;
        }
       
        for (int i = m - 1; i >= 0; i--){
        	 //原地更新矩阵
            for (int j = 1; j < n; j++) 
                if (!matrix[i][0] || !matrix[0][j]) 
                    matrix[i][j] = 0;
            //更新矩阵第一列
            if (flag_col0) 
                matrix[i][0] = 0;   
        }
    }
};

你可能感兴趣的:(Leetcode)