矩陣置0
給定一個 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)
的額外空間,但這仍然不是最好的解決方案。 你能想出一個常數空間的解決方案嗎?
我的題解
利用set的特性,將需要清零的行列座標放入set,再清零。
空間複雜度:O(m+n)
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
if(matrix.empty())
return;
int r = matrix.size();
int c = matrix[0].size();
set<int> rs;
set<int> cs;
set<int>::iterator sit;
//將有0的行列提取出來
for (int i = 0; i < r; i++)
{
for (int j = 0; j < c; j++)
{
if (matrix[i][j] == 0)
{
rs.insert(j);
cs.insert(i);
}
}
}
if (!cs.empty())
{
int a = c;
vector<int> temp;
while (a > 0)
{
temp.push_back(0);
a--;
}
//將行清零
for (sit = cs.begin(); sit != cs.end(); sit++)
{
matrix[*sit] = temp;
}
}
//將列清零
if (!rs.empty())
{
for (sit = rs.begin(); sit != rs.end(); sit++)
{
for (int k = 0; k< r; k++)
{
matrix[k][*sit] = 0;
}
}
}
}
};
官方題解
方法 2:O(1)空間的暴力 驚呆我
在上面的方法中我們利用額外空間去記錄需要置零的行號和列號,通過修改原始矩陣可以避免額外空間的消耗。
算法
遍歷原始矩陣,如果發現如果某個元素 cell[i][j] 爲 0,我們將第 i 行和第 j 列的所有非零元素設成很大的負虛擬值(比如說 -1000000)。注意,正確的虛擬值取值依賴於問題的約束,任何允許值範圍外的數字都可以作爲虛擬之。
最後,我們便利整個矩陣將所有等於虛擬值(常量在代碼中初始化爲 MODIFIED)的元素設爲 0。
class Solution {
public void setZeroes(int[][] matrix) {
int MODIFIED = -1000000;
int R = matrix.length;
int C = matrix[0].length;
for (int r = 0; r < R; r++) {
for (int c = 0; c < C; c++) {
if (matrix[r][c] == 0) {
// We modify the corresponding rows and column elements in place.
// Note, we only change the non zeroes to MODIFIED
for (int k = 0; k < C; k++) {
if (matrix[r][k] != 0) {
matrix[r][k] = MODIFIED;
}
}
for (int k = 0; k < R; k++) {
if (matrix[k][c] != 0) {
matrix[k][c] = MODIFIED;
}
}
}
}
}
for (int r = 0; r < R; r++) {
for (int c = 0; c < C; c++) {
// Make a second pass and change all MODIFIED elements to 0 """
if (matrix[r][c] == MODIFIED) {
matrix[r][c] = 0;
}
}
}
}
}
作者:LeetCode
鏈接:https://leetcode-cn.com/problems/set-matrix-zeroes/solution/ju-zhen-zhi-ling-by-leetcode/
來源:力扣(LeetCode) 著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。