zoukankan      html  css  js  c++  java
  • Set Matrix Zeroes

    题目链接

    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;
            }
        }
    };
    

    小结

    • 很少遇到对空间复杂度有要求的题目
  • 相关阅读:
    bzoj 4012: [HNOI2015]开店
    POJ 1054 The Troublesome Frog
    POJ 3171 Cleaning Shifts
    POJ 3411 Paid Roads
    POJ 3045 Cow Acrobats
    POJ 1742 Coins
    POJ 3181 Dollar Dayz
    POJ 3040 Allowance
    POJ 3666 Making the Grade
    洛谷 P3657 [USACO17FEB]Why Did the Cow Cross the Road II P
  • 原文地址:https://www.cnblogs.com/multhree/p/10459292.html
Copyright © 2011-2022 走看看