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

    小结

    • 很少遇到对空间复杂度有要求的题目
  • 相关阅读:
    关于题目中的内存限制
    手动实现最小堆和最大堆(优先队列)
    线性筛素数(欧拉筛)+前缀和优化
    并查集
    快速排序

    字典按中文姓名排序
    oc程序代码
    学生字典计算年龄差 随机50个数
    nsset
  • 原文地址:https://www.cnblogs.com/multhree/p/10459292.html
Copyright © 2020-2023  润新知