LeetCode73 矩陣置零

2021-10-07 18:44:03 字數 1759 閱讀 3344

可以開乙個額外的二維陣列,記錄每個位置的元素是否已被訪問過。

然後我們遍歷原來的二維陣列,只要沒被訪問過且元素為0,那麼就將該元素所在的行和列的元素值置為0,

並且將這一行的所有元素都設定為已經訪問過,以免之後的遍歷碰到被置為0的元素也將那一行那一列的元素置為0.

這裡要注意,對於乙個為0且未被訪問的元素所在的行和列的元素置0的時候,要跳過本來就為0的元素,因為可能之後的遍歷

到了其他的本來就為0的元素,由於置了那個元素的狀態為訪問過,就會跳過這個元素,導致沒有將那個元素所在的行和列所在的

元素置0.

**如下:

class solution 

}for(int k = 0; k < cols; ++k) }}

}}}};

給每乙個元素都設定乙個訪問狀態需要開二維陣列,有點麻煩。

由於我們只需要把0所在的行和列的元素置為0,所以我們可以這樣:遍歷一遍陣列,如果某個元素為0,

那麼我們記錄一下這個元素的行號和列號。

最後把所有我們記錄過的行和列的元素全部置為0即可。

使用這種方法需要開乙個o(n)的陣列記錄每一行是否有0元素,還要開乙個o(m)陣列記錄每一列是否有0元素。

因此空間開銷是o(m + n)。

**如下:

class solution }}

for(int i = 0; i < rows; ++i) }}

for(int j = 0; j < cols; ++j) }}

}};

由於要將0元素所在的行和列所在的所有元素都置為0,我們就需要記錄哪些行哪些列含有0元素,但是又不能開陣列記錄,那怎麼辦呢?

可以考慮直接用原陣列記錄,比如解法二里開了乙個列大小的陣列記錄每一行是否有0,又開了乙個行大小的陣列記錄每一列是否有0.

我們可以直接在第0行和第0列記錄!比如,如果martix[i][j]為0,那麼我們就讓martix[i][0]為0,表示第i行含有元素0,之後需要將該行所有元素都改為0.

再讓martix[0][j]為0,表示第j列含有元素0,之後需要講該列所有元素都改為0.

這樣我們就不需要額外開陣列了,但是又有個問題,這樣修改了原來的第0行和第0列的元素,咋辦?

問題不大,只能開常數空間,不代表不能開空間,我們額外用兩個變數記錄第0行和第0列是否有0,如果有,在最後就將第0行(列)的所有元素改為0,

如果沒有,那麼如果第0行或第0列的元素所在的行(列)沒有0,那麼他們還是原來的值(沒有被修改),如果有,那說明(對第0行/列元素的修改)正好改對了呀,

反正他們最後本來就是0! 這樣就解決了空間的問題,使用常數空間就可以將矩陣置0.

**如下:

class solution 

}for(int i = 0; i < rows; ++i)

}for(int i = 1; i < rows; ++i) }}

for(int j = 1; j < cols; ++j) }}

for(int i = 1; i < rows; ++i) }}

for(int j = 1; j < cols; ++j) }}

if(firstrowhaszero)

}if(firstcolhaszero) }}

};

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...

leetcode73 矩陣置零

給定乙個 m x n 的矩陣,如果乙個元素為 0,則將其所在行和列的所有元素都設為 0。請使用原地演算法。示例 1 輸入 1,1,1 1,0,1 1,1,1 輸出 1,0,1 0,0,0 1,0,1 空間複雜度為o mn 的解法自不用多說,直接新建乙個和matrix等大小的矩陣,然後一行一行的掃,只...

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...