Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.數組
解題思路:spa
題目乍一看很簡單,將矩陣當前爲0的位的行列都置爲0;code
問題在於:當遇到一個已知0時,不能馬上將其行列置0,由於這樣會把本來不是0的位更改,致使繼續遍歷的時候沒法區分哪些是初始0,哪些是後改0;blog
有一個解決方法,就是先遍歷全部位,記錄全部初始爲0的行列座標,遍歷一遍以後,再統一作更改;element
可是這個解決方法會佔用額外的空間,如何使用o(1)空間完成置0的任務?it
解決方法:io
一、先找到一個初始0位置,並記錄它的行oi和列oj;class
二、oi行和oj列最終須要置零,索性將oi這一行和oj這一列當作記錄數組;遍歷
三、遍歷全部位置,若是遇到0,則將其i和j對應的(oi, j)和(i, oj)置0,這樣不會多置0,也作到了標記的做用;方法
四、最終遍歷oi這一行,將值爲0的位置所在列置0;同理遍歷oj這一列的元素,將其值爲0的位置所在行置0;
代碼:
1 class Solution { 2 public: 3 void setZeroes(vector<vector<int>>& matrix) { 4 int m = matrix.size(); 5 if (m == 0) 6 return; 7 int n = matrix[0].size(); 8 int oi = -1, oj = -1; 9 for (int i = 0; i < m; ++i) { 10 for (int j = 0; j < n; ++j) { 11 if (matrix[i][j] == 0) { 12 oi = i; 13 oj = j; 14 break; 15 } 16 } 17 if (oi != -1) break; 18 } 19 if (oi == -1) return; 20 21 for (int i = 0; i < m; ++i) { 22 for (int j = 0; j < n; ++j) { 23 if (matrix[i][j] == 0) { 24 matrix[oi][j] = 0; 25 matrix[i][oj] = 0; 26 } 27 } 28 } 29 30 for (int i = 0; i < m; ++i) { 31 if (i != oi && matrix[i][oj] == 0) { // notice 32 for (int j = 0; j < n; ++j) 33 matrix[i][j] = 0; 34 } 35 } 36 37 for (int j = 0; j < n; ++j) { 38 if (matrix[oi][j] == 0) { 39 for (int i = 0; i < m; ++i) 40 matrix[i][j] = 0; 41 } 42 } 43 44 for (int j = 0; j < n; ++j) 45 matrix[oi][j] = 0; 46 47 return; 48 } 49 };