leetcode第73题,矩阵置零,java实现

15 篇文章 0 订阅

题目链接

运行结果

执行结果:通过
执行用时 :2 ms, 在所有 Java 提交中击败了55.24%的用户
内存消耗 :47.8 MB, 在所有 Java 提交中击败了87.63%的用户

代码与注释

class Solution {
    public void setZeroes(int[][] matrix) {
        int R = matrix.length; // 行长度
        int C = matrix[0].length; // 列长度
        boolean  zeroCol = false;
        // 做标记
        for (int i = 0; i < R; i++)
        {
            if (matrix[i][0] == 0) zeroCol = true; // 判断首列是否有零

            for (int j = 1; j < C; j++)
            {
                if (matrix[i][j] == 0)
                {
                    matrix[i][0] = 0; // 行标记
                    matrix[0][j] = 0; // 列标记
                }
            }
        }
        // 根据标记写0
        for (int i = 1; i < R; i++)
        {
            for (int j = 1; j < C; j++)
            {
                if (matrix[i][0] == 0 || matrix[0][j] == 0)
                {
                    matrix[i][j] = 0;
                }
            } 
        }
        // 最后处理零行
        if (matrix[0][0] == 0)
        {
            for (int j = 0; j < C; j++) matrix[0][j] = 0;
        }
         // 最后处理零列
        if (zeroCol)
        {
            for (int i = 0; i < R; i++) matrix[i][0] = 0;
        }
    }
}

做题体会

  1. 题目要求使用原地算法,空间复杂度为O(1),那么需要直接修改原矩阵。
  2. 一个mxn的矩阵,遍历时间复杂度至少的情况为O(m*n)。
  3. 基本想法是,遍历矩阵,当出现零时,在其对应的行、列的首位,置零标识,根据该标识将对应的行列置零即可。这个做法的好处是,标识占用的空间是原数组空间,且标识置位与m或n的长度无关,无需额外的时间复杂度。
  4. 该算法的时间复杂度为O(m*n),空间复杂度为O(1)。
  5. 需要注意的是,数组零零位置为零,表示零行需要置零,零列置零需要额外的标志位zeroCol。
  6. 当遍历整个数组,进行置零操作时,最后处理零行和零列,防止标识丢失。
  7. 有另一种类似的算法,空间复杂度也为O(1),区别在于,遍历整个矩阵找到零时,将该零所在的行、列除零外的数置为一个极小负值,最后出现该极小负值的所有位置置零即可,因为在遍历整个数组的基础上,还需要额外遍历行列,做标识,所以该算法的时间复杂度为O((m*n)x(m+n))。

算法二

运行结果

执行结果:通过
执行用时 :5 ms, 在所有 Java 提交中击败了17.32%的用户
内存消耗 :43.6 MB, 在所有 Java 提交中击败了97.32%的用户

代码与注释

class Solution {
    public void setZeroes(int[][] matrix) {
        int R = matrix.length; // 行长度
        int C = matrix[0].length; // 列长度
        Set<Integer> row = new HashSet<Integer>();
        Set<Integer> col = new HashSet<Integer>();
        // 记录需置零的行号和列号
        for (int i = 0; i < R; i++)
        {
            for (int j = 0; j < C; j++)
            {
                if (matrix[i][j] == 0)
                {
                    row.add(i);
                    col.add(j);
                }
            } 
        }
        // 查询hash表,置零
        for (int i = 0; i < R; i++)
        {
            for (int j = 0; j < C; j++)
            {
                if (row.contains(i) || col.contains(j))
                {
                    matrix[i][j] = 0;
                }
            } 
        }
    }
}

做题体会

  1. 时间复杂度为O(mxn),空间复杂度为O(m+n)。
  2. 需要额外的空间,存储需要置零的行号和列号,采用的hash表,查询比较高效。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值