【Leetcode】【Medium】Set Matrix Zeroes

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 };
相關文章
相關標籤/搜索