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

    小结

    • 很少遇到对空间复杂度有要求的题目
  • 相关阅读:
    influxdb + cadvisor + grafana 监控 docker容器应用性能
    zabbix_get命令
    【工作笔记】python+influxdb+grafana监控云行情
    沙雕与大婶 | 把5W2H融入你的架构设计吧
    GO系列 | 5分钟入门GO【译】
    Docker深入浅出系列 | 5分钟搭建你的私有镜像仓库
    Docker深入浅出系列 | Swarm多节点实战
    Docker如何给Springboot项目动态传参
    沙雕与大婶 | Mock掉你的外部依赖吧
    ed后缀读音规则
  • 原文地址:https://www.cnblogs.com/multhree/p/10459292.html
Copyright © 2020-2023  润新知