LeetCode:矩阵置零【73】

LeetCode:矩阵置零【73】

题目描述

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

示例 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) 的额外空间,但这仍然不是最好的解决方案。
  • 你能想出一个常数空间的解决方案吗?

题目分析

  关于进阶的内容,大家可以思考,这里也给出大家官方的题解:

LeetCode官方题解:https://leetcode.com/articles/set-matrix-zeroes/

  这道题能总而言之,不能想当然的认为,在处理过程中需要处理所有的新生成的零。那么的直观思路就遍历两边数组,第一遍是用HashSet去记录每个0点的横纵坐标,然后第二遍循环再把那些在已记录的行或列上的元素全部赋值为0即可。

Java题解

package arr;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;

public class SetMatrixZeroes_73 {
    public void setZeroes(int[][] matrix) {
        int R = matrix.length;
        int C = matrix[0].length;
        Set<Integer> rows = new HashSet<Integer>();
        Set<Integer> cols = new HashSet<Integer>();

        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
                if (matrix[i][j] == 0) {
                    rows.add(i);
                    cols.add(j);
                }
            }
        }

        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
                if (rows.contains(i) || cols.contains(j)) {
                    matrix[i][j] = 0;
                }
            }
        }
    }
}

  

猜你喜欢

转载自www.cnblogs.com/MrSaver/p/9899100.html
今日推荐