1. 程式人生 > >LeetCode 73.Set Matrix Zeroes (矩陣置零)

LeetCode 73.Set Matrix Zeroes (矩陣置零)

題目描述:

給定一個 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]
]

AC C++ Solution:

class Solution {
public:
    void setZeroes(vector<vector<int> > &matrix) {
        int col0 = 1, rows = matrix.size(), cols = matrix[0].size();
        
        //用col0記錄第一列的情況
        for (int i = 0; i < rows; i++) {            //將每行每列的狀態儲存到行和列的開頭
            if (matrix[i][0] == 0) col0 = 0;
            for (int j = 1; j < cols; j++)
                if (matrix[i][j] == 0)
                    matrix[i][0] = matrix[0][j] = 0;
        }

        for (int i = rows - 1; i >= 0; i--) {       
            for (int j = cols - 1; j >= 1; j--)
                if (matrix[i][0] == 0 || matrix[0][j] == 0) //根據行首和列首的狀態設定每個位置的狀態
                    matrix[i][j] = 0;
            if (col0 == 0) matrix[i][0] = 0;
        }
    }
};

這種解法必須注意要用單獨的一個標誌記錄行首或者列首的情況,並且不能用(0,0)來記錄。不然到後面根據行首或者列首狀態來設定某位時不知道(0,0)點到底是根據行還是列的狀態設定的。