1. 程式人生 > >LeetCode-中級-矩陣置零(JavaScript)

LeetCode-中級-矩陣置零(JavaScript)

給定一個 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) 的額外空間,但這仍然不是最好的解決方案。
  • 你能想出一個常數空間的解決方案嗎?

思路:

這裡只給出最優解,空間複雜度為O(1)。

本題的思路是用第一行來儲存其餘行中某列是否為0元素。例如:第二行第三列為0,則將第一行第三列置為0,然後將第二行全部置為0。行的方向判斷完後,就看第一行哪些元素為0,將0元素所在的列置為0。

不過,直接這樣會覆蓋原先第一行本就有的0,所以一開始要先遍歷第一行,只需記錄第一行是否有0,在最後,再根據第一行是否有0,來決定第一行是否需要全部置為0。

於是,具體步驟如下:

1、遍歷第一行,看有沒有0

2、從第二行開始遍歷,若當前行有0,則在第一行中對應列的元素變為0,並將該行都置為0

3、遍歷第一行,將0元素所在的列都置為0

4、若第一行本就有0,則將第一行全部置為0

/**
 * @param {number[][]} matrix
 * @return {void} Do not return anything, modify matrix in-place instead.
 */
var setZeroes = function(matrix) {
  let m = matrix.length,
      n = matrix[0].length
  let firstRowContains0 = false
  
//   遍歷第一行,看有沒有0
  for (let col = 0; col < n; col++) {
    if (matrix[0][col] === 0) {
      firstRowContains0 = true
      break
    }
  }
  
//   從第二行開始遍歷
  for (let row = 1; row < m; row++) {
    let thisRowContains0 = false
//     若當前行有0, 則在第一行中對應列的元素變為0
    for (let col = 0; col < n; col++) {
      if (matrix[row][col] === 0) {
        matrix[0][col] = 0
        thisRowContains0 = true
      }
    }
//     若這行有0, 則把這一行都置為0
    if (thisRowContains0) {
      for (let col = 0; col < n; col++) 
        matrix[row][col] = 0
    }
  }
  
//   遍歷第一行,將0元素所在的列都置為0
  for (let col = 0; col < n; col++) {
    if (matrix[0][col] === 0) {
      for (let row = 1; row < m; row++) {
        matrix[row][col] = 0
      }
    }
  }
  
//   最後,若第一行本來有0元素,就把第一行都置為0
  if (firstRowContains0) {
    for (let col = 0; col < n; col++)
      matrix[0][col] = 0
  }
};

執行用時112ms