leetcode[73] Set Matrix Zeroes 將矩陣置零


給定一個矩陣,把零值所在的行和列都置為零。例如:

1 2 3

1 0 3

1 1 1

操作之后變為

1 0 3

0 0 0

1 0 1

 

方法1:

賦值另存一個m*n的矩陣,在原矩陣為零的值相應置新的矩陣行和列為零。額外空間為O(m*n).

 

方法2:

兩個數組,bool[m] 和 bool[n] 分別存某行有零,后者某列有零。之后根據數組值將原矩陣相應位置置零。額外空間O(m + n)。

class Solution {
public:
    void setZeroes(vector<vector<int> > &matrix) {
        int len1 = matrix.size();
        if (len1 == 0) return ;
        int len2 = matrix[0].size();
        if (len2 == 0) return ;
        vector<bool > row(len1), col(len2);
        for (int i = 0; i < len1; i++)
            for (int j = 0; j < len2; j++)
            {
                if (matrix[i][j] == 0)
                {
                    row[i] = true; col[j] = true;   
                }
            }
        for (int i = 0; i < len1; i++)
            for (int j = 0; j < len2; j++)
            {
                if (row[i] == true)
                    matrix[i][j] = 0;
                else if (col[j] == true)
                    matrix[i][j] = 0;
            }
        return ;
    }
};

 

方法3:(常數額外空間)

1. 找到一個零的位置,把這行這列當做方法2中的兩個數組存值。

2. 根據1的位置的所在行和列的值是否有零將矩陣相應位置置零。

3. 再把1中零所在位置的行和列置零。

class Solution {
public:
    void setZeroes(vector<vector<int> > &matrix) {
        int len1 = matrix.size();
        if (len1 == 0) return ;
        int len2 = matrix[0].size();
        if (len2 == 0) return ;
        int row = -1, col = -1;
        for (int i = 0; i < len1; i++)
            for (int j = 0; j < len2; j++)
            {
                if (matrix[i][j] == 0)
                {
                    row = i; col = j;
                }
            }
        if (row == -1) return;
        for (int i = 0; i < len1; i++)
            for (int j = 0; j < len2; j++)
            {
                if (matrix[i][j] == 0 && i != row && j != col)
                {
                    matrix[i][col] = 0;
                    matrix[row][j] = 0;
                }
            }
        for (int i = 0; i < len1; i++)
            for (int j = 0; j < len2; j++)
            {
                if (i != row && j != col)
                {
                    if (matrix[i][col] == 0 )
                        matrix[i][j] = 0;
                    else if (matrix[row][j] == 0)
                        matrix[i][j] = 0;
                }
            }
        int index = -1; 
        while(++index < len1) matrix[index][col] = 0;
        index = -1;
        while(++index < len2) matrix[row][index] = 0;
        return ;
    }
};

 

2015/03/25:

Python:

用第一行和第一列記錄這一行和這一列中是否有零,當然,一開始要先用row和col記錄第一行和第一列是否有零,最后再根據這個判斷是否將第一行第一列置零

class Solution:
    # @param matrix, a list of lists of integers
    # @return nothing (void), do not return anything, MODIFY matrix IN PLACE.
    def setZeroes(self, matrix):
        if len(matrix) == 0:
            return ;
        row, col = 1, 1
        for i in range(0, len(matrix)):
            if matrix[i][0] == 0:
                col = 0
        for j in range(0, len(matrix[0])):
            if matrix[0][j] == 0:
                row = 0
        
        for i in range(1, len(matrix)):
            for j in range(1, len(matrix[0])):
                if matrix[i][j] == 0:
                    matrix[i][0] = 0
                    matrix[0][j] = 0
        for i in range(1, len(matrix)):
            for j in range(1, len(matrix[0])):
                if matrix[i][0] == 0 or matrix[0][j] == 0:
                    matrix[i][j] = 0
                    
        if col == 0:
            for i in range(0, len(matrix)):
                matrix[i][0] = 0
        if row == 0:
            for j in range(0, len(matrix[0])):
                matrix[0][j] = 0

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM