1. 程式人生 > >LeetCode:矩陣置零【73】

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;
                }
            }
        }
    }
}