73 矩陣置零 力扣(LeetCode)

2021-09-27 12:44:54 字數 1815 閱讀 3953

給定乙個 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(mn)的解決方案是用與原陣列大小相同的來mark或者set_zeros,很容易實現。而o(m + n)的解決方案是用乙個rows[n]的陣列來標記哪些行該置為0,用cols[m]陣列標記哪些列該置為0。

原地操作的方法沒想到,參考的是官方題解。

先遍歷一次矩陣,若matrix[i][j] = 0,則直接將matrix[i][0]和matrix[0][j]置為0。這樣做只是用遍歷過的元素做標記,不會影響後面元素,很靈性的乙個做法。當然,這樣直接操作會帶來乙個問題,當第一行或第一列有元素為0,都會使matrix[0][0]=0,不能區分對第一行和第一列進行區分,需要用到乙個標記來區分。

最後對第一行和第一列的元素進行遍歷,具體操作依據下面公式:

matrix[i][j] = 0&(i\geq0& and&i\leq n)&if&matrix[0][j]=0(j \neq 0)\\ matrix[i][j] = 0&(j\geq0&and&j\leq m)&if&matrix[i][0]=0\\ matrix[i][0] = 0&(i\geq0&and&i\leq n)&if&flag\_first\_col=true \end

⎩⎪⎨⎪⎧​

matr

ix[i

][j]

=0ma

trix

[i][

j]=0

matr

ix[i

][0]

=0​(

i≥0(

j≥0(

i≥0​

anda

ndan

d​i≤

n)j≤

m)i≤

n)​i

fifi

f​ma

trix

[0][

j]=0

(j​

=0)m

atri

x[i]

[0]=

0fla

g_fi

rst_

col=

true

/*

時間複雜度為o(mn)

力扣 73 矩陣置零

給定乙個 m x n 的矩陣,如果乙個元素為 0 則將其所在行和列的所有元素都設為 0 請使用 原地 演算法。高階 乙個直觀的解決方案是使用 o mn 的額外空間,但這並不是乙個好的解決方案。乙個簡單的改進方案是使用 o m n 的額外空間,但這仍然不是最好的解決方案。你能想出乙個僅使用常量空間的解...

73 矩陣置零

方法1 賦值另存乙個m n的矩陣,在原矩陣為零的值相應置新的矩陣行和列為零。額外空間為o m n o m n o m n 方法2 兩個陣列,bool m 和 bool n 分別存某行有零,後者某列有零。之後根據陣列值將原矩陣相應位置置零。額外空間o m n o m n o m n 方法3 看來許久才...

73 矩陣置零

題目.middle 要想不使用額外空間,那麼就需要將標誌位設在原來的資料上面,這裡就把第一行和第一列用來儲存改行或者該列是否有0 的標誌,這樣原來是否是0就被覆蓋了,所以需要兩個標誌記錄下來 package main import fmt func setzeroes matrix int rows...