LeetCode 73 矩陣置零

2021-10-07 09:38:29 字數 1421 閱讀 4654

思路:

直觀的思路:遍歷矩陣,記錄下每乙個0元素所在的行與列,然後再次遍歷矩陣,若此時遍歷到的位置的行或列**現過0元素,則需要將此位置置為0。這是兩次遍歷,不可以合併為一次遍歷。

空間複雜度為:o(m + n)

使用兩個hashset,分別儲存當前位置的數為0時的行號與列號

public void setzeroes(int matrix) 

// 存放元素為0的行號

hashsetrows = new hashset<>();

// 存放元素為0的列號

hashsetcols = new hashset<>();

for (int i = 0; i < matrix.length; i++) }}

for (int i = 0; i < matrix.length; i++) }}

}

原地解決此問題

即空間複雜度為o(1),思路如下:

利用原矩陣的第一行與第一列記錄元素0所在的行與列

若當前位置的元素為0,則將它所在行的第乙個元素與所在列的第乙個元素都置為0,代表此行此列出現過0元素,需要將此行此列所有元素都置為0

由於第一行與第一列都用於記錄此行此列是否存在元素0,對第一行與第一列元素有所破壞,所以需要對第一行與第一列的元素進行單獨標記,單獨處理

使用兩個布林型別的變數來記錄第一行與第一列中是否出現過0元素。使用row0 來標記第一行中是否出現了0元素,使用col0來標記第一列中是否出現了0元素

**參考自:

public void setzeroes(int matrix) 

// 由於第一行與第一列都用於記錄此行此列是否存在元素0,對第一行與第一列元素有所破壞

// 所以需要對第一行與第一列的元素進行單獨標記

// 使用row0 來標記第一行中是否出現了0元素,使用col0來標記第一列中是否出現了0元素

boolean row0 = false, col0 = false;

for (int i = 0; i < matrix.length; i++)

// 當前位置為第一列

if (j == 0)

// 此行此列的乙個元素均置為0

matrix[i][0] = matrix[0][j] = 0;}}

}// 從1,1位置開始遍歷

// 這是因為第一行與第一列是用來記錄此行此列是否有元素0,需要進行處理

for (int i = 1; i < matrix.length; i++) }}

// 若第一行中本身含有0元素,則將第一行中所有元素置為0

if (row0)

}// 若第一列中本身含有0元素,則將第一列中所有元素置為0

if (col0)

}}

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