Set Matrix Zeroes - LeetCode

题目链接

Set Matrix Zeroes - LeetCode

注意点

  • 不要用O(mn)空间复杂度的解法

解法

解法一:line数组表示第i行是否有0,row数组表示第i列是否有0,先遍历一遍,某个位置为0就修改相应的数组。最后根据line和row两个数组来修改matrix。时间复杂度O(mn),空间复杂度O(m+n)

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        if(matrix.size() == 0 || matrix[0].size() == 0) return;
        int m = matrix.size(),n = matrix[0].size();
        int i,j,line[m],row[n];
        for(i = 0;i < m;i++) line[i] = 0;
        for(i = 0;i < n;i++) row[i] = 0;
        for(i = 0;i < m;i++)
        {
            for(j = 0;j < n;j++)
            {
                if(matrix[i][j] == 0)
                {
                    line[i] = 1;
                    row[j] = 1;
                }
            }
        }
        for(i = 0;i < m;i++)
        {
            if(line[i] == 1)
            {
                for(j = 0;j < n;j++) matrix[i][j] = 0;
            }
        }
        for(i = 0;i < n;i++)
        {
            if(row[i] == 1)
            {
                for(j = 0;j < m;j++) matrix[j][i] = 0;
            }
        }
    }
};

解法二:用line和row来标记第一行第一列是否有0。然后遍历除第一行第一列之外的matrix,如果某个位置为0就把第一行第一列的对应位置置0,然后再遍历一遍除第一行第一列之外的matrix,如果对应的第一行或者第一列为0,就置为0。时间复杂度O(mn),空间复杂度O(1)

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        if(matrix.size() == 0 || matrix[0].size() == 0) return;
        int m = matrix.size(),n = matrix[0].size();
        int i,j;
        bool line = false,row = false;
        for(i = 0;i < n;i++)
        {
            if(matrix[0][i] == 0) line = true;
        }
        for(i = 0;i < m;i++) 
        {
            if(matrix[i][0] == 0) row = true;
        }
        for(i = 1;i < m;i++)
        {
            for(j = 1;j < n;j++)
            {
                if(matrix[i][j] == 0)
                {
                    matrix[0][j] = 0;
                    matrix[i][0] = 0;
                }
            }
        }
        for(i = 1;i < m;i++)
        {
            for(j = 1;j < n;j++)
            {
                if(matrix[0][j] == 0 || matrix[i][0] == 0) matrix[i][j] = 0;
            }
        }
        if(line == true)
        {
            for(i = 0;i < n;i++) matrix[0][i] = 0;
        }
        if(row == true)
        {
            for(i = 0;i < m;i++) matrix[i][0] = 0;
        }
    }
};

小结

  • 很少遇到对空间复杂度有要求的题目
posted @ 2019-03-01 23:06  闽A2436  阅读(160)  评论(0编辑  收藏  举报