LeetCode 73. 矩阵置零——每日一题

上一篇博客:堆优化版Dijkstra算法

 写在前面:大家好!我是AC-fun,我的昵称来自两个单词Acceptedfun。我是一个热爱ACM的蒟蒻。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正,感谢大家的不吝赐教。我的唯一博客更新地址是:https://ac-fun.blog.csdn.net/。非常感谢大家的支持。一起加油,冲鸭!
用知识改变命运,用知识成就未来!加油 (ง •̀o•́)ง (ง •̀o•́)ง

原题链接:LeetCode 73. 矩阵置零

题目信息

题目描述

 给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。

进阶:

  • 一个直观的解决方案是使用 O(mn) 的额外空间,但这并不是一个好的解决方案。
  • 一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
  • 你能想出一个仅使用常量空间的解决方案吗?

示例 1

示例1

输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]

示例 2

示例2

输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]

提示

  • m == matrix.length
  • n == matrix[0].length
  • 1 <= m, n <= 200
  • -231 <= matrix[i][j] <= 231 - 1

题解

暴力解法

解题思路

 先遍历一遍二维数组,将所有等于 0 的元素下标存到一个数组中。然后再遍历所有元素等于 0 的下标,将相关的行和列的值改为 0 即可。时间复杂度为 O(n3)

解题代码

class Solution {
    
    
public:
    void setZeroes(vector<vector<int>>& matrix) {
    
    
        vector<pair<int, int>> m0;
        for (int i = 0; i < matrix.size(); i++) {
    
    
            for (int j = 0; j < matrix[i].size(); j++) {
    
    
                if (matrix[i][j] == 0) m0.push_back({
    
    i, j});
            }
        }
        for (auto p : m0) {
    
    
            for (int i = 0; i < matrix.size(); i++) {
    
    
                for (int j = 0; j < matrix[i].size(); j++) {
    
    
                    if (i == p.first || j == p.second) matrix[i][j] = 0;
                }
            }
        }
    }
};

优化解法(原地算法)

解题思路

 可以直接利用原数组的第 0 行和第 0 列来标识对应的行和列是否需要全部变为 0。这里需要注意的是第 0 行和第 0 列需要特殊处理,使用两个变量 r0 = 1c0 = 1 分别标识第 0 行和第 0 列是否需要变为 0

 首先遍历一下第 0 行和第 0 列如果有一个 0 那么说明该行需要变为 0,那么就将相应的变量变为 0。然后再从第 1 行第 1 列开始遍历数组,将需要变为 0 的行和列的第一个元素变为 0 否则就不改变其值。最后再处理第 0 行和第 0 列。

解题代码

class Solution {
    
    
public:
    void setZeroes(vector<vector<int>>& matrix) {
    
    
        int r0 = 1, c0 = 1; // r0 标识第 0 行是否需要全部变为 0
        // 判断第 0 行是否需要变为 0
        for (int i = 0; i < matrix[0].size(); i++) {
    
    
            if (matrix[0][i] == 0) r0 = 0;
        }
        // 判断第 0 列是否需要变为 0
        for (int i = 0; i < matrix.size(); i++) {
    
    
            if (matrix[i][0] == 0) c0 = 0;
        }
        // 判断其他行和列是否需要变为 0
        for (int i = 1; i < matrix.size(); i++) {
    
    
            for (int j = 1; j < matrix[0].size(); j++) {
    
    
                if (matrix[i][j] == 0) {
    
    
                    matrix[i][0] = 0;
                    matrix[0][j] = 0;
                }
            }
        }
        // 将需要变为 0 的行变为 0
        for (int i = 1; i < matrix.size(); i++) {
    
    
            if (matrix[i][0] == 0) {
    
    
                for (int j = 0; j < matrix[0].size(); j++) {
    
    
                    matrix[i][j] = 0;
                }
            }
        }
        // 将需要变为 0 的列变为 0
        for (int i = 1; i < matrix[0].size(); i++) {
    
    
            if (matrix[0][i] == 0) {
    
    
                for (int j = 0; j < matrix.size(); j++) {
    
    
                    matrix[j][i] = 0;
                }
            }
        }
        // 最后处理第 0 行和第 0 列
        if (r0 == 0) {
    
    
            for (int i = 0; i < matrix[0].size(); i++) {
    
    
                matrix[0][i] = 0;
            }
        }
        if (c0 == 0) {
    
    
            for (int i = 0; i < matrix.size(); i++) {
    
    
                matrix[i][0] = 0;
            }
        }
    }
};

未完待续,持续更新中……
Tomcat我们走

猜你喜欢

转载自blog.csdn.net/qq_41575507/article/details/115052914