Day39 矩阵置零

作者: Shimmer_ | 来源:发表于2021-03-05 10:03 被阅读0次

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

    https://leetcode-cn.com/problems/set-matrix-zeroes/

    示例1:

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

    示例2:

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

    提示:

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

    Java解法

    思路:

    • 设想是记录为0 的坐标位置,然后按为0 位置进行列、行置零
    • 使用set分别记录位置
    • 但空间复杂度没有达到要求
    package sj.shimmer.algorithm.m2;
    
    import java.util.HashSet;
    import java.util.Set;
    
    import sj.shimmer.algorithm.Utils;
    
    /**
     * Created by SJ on 2021/3/4.
     */
    
    class D39 {
        public static void main(String[] args) {
            int[][] matrix = {{0,1,2,0}, {3,4,5,2}, {1,3,1,5}};
            setZeroes(matrix);
            Utils.logArrays(matrix);
        }
        public static void setZeroes(int[][] matrix) {
            if (matrix==null||matrix.length==0||matrix[0]==null||matrix[0].length==0) {
                return;
            }
            Set<Integer> zeroColumn = new HashSet<>();
            Set<Integer> zeroLine = new HashSet<>();
            int lineLength = matrix.length;
            int columnLength = matrix[0].length;
            for (int i = 0; i < lineLength; i++) {
                for (int j = 0; j < columnLength; j++) {
                    if (matrix[i][j]==0) {
                        zeroLine.add(i);
                        zeroColumn.add(j);
                    }
                }
            }
            for (int i = 0; i < lineLength; i++) {
                if (zeroLine.contains(i)) {
                    matrix[i] = new int[columnLength];
                    continue;
                }
                for (Integer integer : zeroColumn) {
                    matrix[i][integer] = 0;
                }
            }
        }
    }
    
    image

    官方解

    https://leetcode-cn.com/problems/set-matrix-zeroes/solution/ju-zhen-zhi-ling-by-leetcode/

    1. 额外存储空间方法

      类似于我的解法

      • 时间复杂度:O(M×N)
    • 空间复杂度:O(M+N)
    1. O(1)空间的暴力

      某数据为0时,将该行列不为0的数据设置为虚拟值(约束范围之外的值),遍历完成之后,将虚拟值置为0

      这样实现空间复杂度为O(1)

    相关文章

      网友评论

        本文标题:Day39 矩阵置零

        本文链接:https://www.haomeiwen.com/subject/snhrqltx.html