同步發佈於 Github repo
Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
/**
* @param {number[][]} matrix
* @return {void} Do not return anything, modify matrix in-place instead.
*/
const setZeroes = matrix => {
if(matrix.length === 0) return;
const m = matrix.length, n = matrix[0].length;
let emptyRow0 = false, emptyCol0 = false;
// first row
for(let i = 0; i < n; i++) {
if(matrix[0][i] === 0) {
emptyRow0 = true;
break;
}
}
// first column
for(let i = 0; i < m; i++) {
if(matrix[i][0] === 0) {
emptyCol0 = true;
break;
}
}
for(let i = 1; i< m; i++) {
for(let j = 1; j < n; j++) {
if(matrix[i][j] === 0) {
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
for(let i = 1; i < m; i++) {
for(let j = 1; j < n; j++) {
if(matrix[i][0] === 0 || matrix[0][j] === 0) {
matrix[i][j] = 0;
}
}
}
if(emptyRow0) {
for(let i = 0; i < n; i++) {
matrix[0][i] = 0;
}
}
if(emptyCol0) {
for(let i = 0; i < m; i++) {
matrix[i][0] = 0;
}
}
};
進入到 Matrix
最後一天,今天的題目一樣不難~
題意只有一行,給一個矩陣,如果某一格為 0,則該整行、整列都要為 0,如此簡單!
這題有幾種不同解法,最直接的方式是複製整個 matrix
然後掃過整個矩陣來紀錄每格是否為 0,這樣空間複雜度是 O(mn)
,好像不太好,
所以呢我們用一個空間複雜度是 O(1)
的方式去解,
想法很簡單,我們掃過每一格,如果那格為 0,把 0 映射到該第一行、第一列,
因為只要確定某格對應的第一行、第一列為 0的話,那該行、該列就必定都是 0,
但我們得先另外處理真正的第一行、第一列,避免映射完之後會污染原本的第一行、第一列,而導致答案錯誤。
m
n
分別是矩陣的欄、列,emptyRow0 = false;
emptyCol0 = false;
。const m = matrix.length, n = matrix[0].length;
let emptyRow0 = false, emptyCol0 = false;
true
。// first row
for(let i = 0; i < n; i++) {
if(matrix[0][i] === 0) {
emptyRow0 = true;
break;
}
}
// first column
for(let i = 0; i < m; i++) {
if(matrix[i][0] === 0) {
emptyCol0 = true;
break;
}
}
步驟3.
掃過矩陣中的每一格,如果那格為 0,將 0 映射到該格的第一行、第一列的位置,
接著,透過判斷該位置的第一行、第一列的位置是否為 0,就可以知道該格是否為 0 了!
for(let i = 1; i< m; i++) {
for(let j = 1; j < n; j++) {
if(matrix[i][j] === 0) {
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
for(let i = 1; i < m; i++) {
for(let j = 1; j < n; j++) {
if(matrix[i][0] === 0 || matrix[0][j] === 0) {
matrix[i][j] = 0;
}
}
}
emptyRow0
emptyCol0
,最後處理第一行、第一列的數字是口需要為 0, 完成!if(emptyRow0) {
for(let i = 0; i < n; i++) {
matrix[0][i] = 0;
}
}
if(emptyCol0) {
for(let i = 0; i < m; i++) {
matrix[i][0] = 0;
}
}