资讯专栏INFORMATION COLUMN

[LintCode/LeetCode/CC] Set Matrix Zeroes

zhangwang / 1653人阅读

摘要:把矩阵所有零点的行和列都置零,要求不要额外的空间。对于首行和首列的零点,进行额外的标记即可。这道题我自己做了四遍,下面几个问题需要格外注意标记首行和首列时,从到遍历时,若有零点,则首列标记为从到遍历,若有零点,则首行标记为。

Problem

Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.

Example

Given a matrix

[
  [1,2],
  [0,3]
],

return

[
[0,2],
[0,0]
]
Challenge

Did you use extra space?
A straight forward solution using O(mn) space is probably a bad idea.
A simple improvement uses O(m + n) space, but still not the best solution.
Could you devise a constant space solution?

Note

把矩阵所有零点的行和列都置零,要求不要额外的空间。基本的思路是把这些零点坐标的行和列都标记下来,只不过把标记存在首行和首列。对于首行和首列的零点,进行额外的标记即可。所以,算法的步骤为:
首行、首列标记:分别标记首行和首列是否有零点
子矩阵标记:遍历除首行和首列之外的整个矩阵,将所有零点的坐标分别标记在首行和首列
子矩阵置零:遍历除首行和首列的整个矩阵的所有点,若某点映射在首行或首列的同列点或同行点为零点,便置该点为零点
首行、首列置零:最后分别处理首行、首列,若标记有零点,则首行、首列全部置零。
这道题我自己做了四遍,下面几个问题需要格外注意:

标记首行和首列时,从0到m遍历matrix[i][0]时,若有零点,则首列标记为true;从0到n遍历matrix[0][j],若有零点,则首行标记为true。

必须先标记和置零子矩阵,即行和列的循环都从1开始,否则会影响最后对首行和首列的置零。

Solution
public class Solution {
    public void setZeroes(int[][] matrix) {
        boolean row = false, col = false;
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) return;
        int m = matrix.length, n = matrix[0].length;
        for (int i = 0; i < m; i++) {
            if (matrix[i][0] == 0) col = true;
        }
        for (int j = 0; j < n; j++) {
            if (matrix[0][j] == 0) row = true;
        }
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                if (matrix[i][j] == 0) {
                    matrix[i][0] = matrix[0][j] = 0;
                }
            }
        }
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                if (matrix[i][0] == 0 || matrix[0][j] == 0) {
                    matrix[i][j] = 0;
                }
            }
        }
        for (int i = 0; i < m && col; i++) {
            matrix[i][0] = 0;
        }
        for (int j = 0; j < n && row; j++) {
            matrix[0][j] = 0;
        }
    }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65701.html

相关文章

  • [Leetcode] Set Matrix Zeroes 矩阵置零

    摘要:这个方法的缺点在于,如果我们直接将存入首行或首列来表示相应行和列要置的话,我们很难判断首行或者首列自己是不是该置。 Set Matrix Zeroes Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. click to show follow up...

    waltr 评论0 收藏0
  • leetcode73. Set Matrix Zeroes

    摘要:题目要求当遇到数组中的值时,即将该值所在的行和列全部改为。新建两个数组分别代表该行和该列是否需要清零。然后根据这两个数组的情况对原数组进行赋值。虽然这意味着牺牲了一点时间性能,但是如果数据量非常庞大的话是非常好的一种实现。 题目要求 Given a m x n matrix, if an element is 0, set its entire row and column to 0....

    lookSomeone 评论0 收藏0
  • leetcode 部分解答索引(持续更新~)

    摘要:前言从开始写相关的博客到现在也蛮多篇了。而且当时也没有按顺序写现在翻起来觉得蛮乱的。可能大家看着也非常不方便。所以在这里做个索引嘻嘻。顺序整理更新更新更新更新更新更新更新更新更新更新更新更新更新更新更新更新 前言 从开始写leetcode相关的博客到现在也蛮多篇了。而且当时也没有按顺序写~现在翻起来觉得蛮乱的。可能大家看着也非常不方便。所以在这里做个索引嘻嘻。 顺序整理 1~50 1...

    leo108 评论0 收藏0
  • LeetCode 攻略 - 2019 年 8 月上半月汇总(109 题攻略)

    摘要:每天会折腾一道及以上题目,并将其解题思路记录成文章,发布到和微信公众号上。三汇总返回目录在月日月日这半个月中,做了汇总了数组知识点。或者拉到本文最下面,添加的微信等会根据题解以及留言内容,进行补充,并添加上提供题解的小伙伴的昵称和地址。 LeetCode 汇总 - 2019/08/15 Create by jsliang on 2019-08-12 19:39:34 Recently...

    tracy 评论0 收藏0
  • Leetcode PHP题解--D68 283. Move Zeroes

    摘要:题目链接题目分析给定一个整数数组,将值为的元素移动到数组末尾,而不改动其他元素出现的顺序。再在去后的元素末尾填充到计算出的数组长度。最终代码若觉得本文章对你有用,欢迎用爱发电资助。 D68 283. Move Zeroes 题目链接 283. Move Zeroes 题目分析 给定一个整数数组,将值为0的元素移动到数组末尾,而不改动其他元素出现的顺序。 思路 计算总共有多少个元素。 再...

    xiongzenghui 评论0 收藏0

发表评论

0条评论

zhangwang

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<