リンク
https://leetcode-cn.com/problems/set-matrix-zeroes/
時間がかかる
問題解決:33分
問題解決:18分
題名
mxn行列が与えられ、要素が0の場合、その行と列のすべての要素を0に設定します。インプレースアルゴリズムを使用してください。
上級:
- 直感的な解決策は、O(mn)の余分なスペースを使用することですが、これは適切な解決策ではありません。
- 単純な改善は、O(m + n)の余分なスペースを使用することですが、これはまだ最善の解決策ではありません。
- 一定のスペースのみを使用するソリューションを考えられますか?
促す:
- m == matrix.length
- n == matrix [0] .length
- 1 <= m、n <= 200
- − 2 31 -2 ^ {31} − 23 1 <=行列[i] [j] <=2 31 − 1 2 ^ {31} -123 1−1
アイデア
最初の行と最初の列をマーク位置として取得します。つまり、特定の位置[i] [j]が0である場合、この行の最初の要素とこの列の最初の要素を0としてマークします。次に、最初の行と最初の列をトラバースし、最初の行に0要素があるすべての列を0に設定し、最初の列に0要素があるすべての行を0に設定します。
詳細:最初の行と最初の列はマークされた位置であるため、上記の操作は最初の行と最初の列では実行できず、特別な処理が必要です。操作の前に、最初に最初の行に0があるかどうかを判断し、最初の列、およびそれらを別々にマークします。上記の操作が終わったら、前の最初の行と最初の列の他のマークを判断し、これに基づいて最初の行と最初の列がゼロに設定されているかどうかを確認します。
時間計算量:O(m ∗ n)O(m * n)O (m∗n )
ACコード
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int m = matrix.size();
int n = matrix[0].size();
bool flag_0r = false, flag_0c = false;
for(int i = 0; i < m; ++i) {
if(matrix[i][0] == 0) {
flag_0c = true;
break;
}
}
for(int j = 0; j < n; ++j) {
if(matrix[0][j] == 0) {
flag_0r = true;
break;
}
}
for(int i = 1; i < m; ++i) {
for(int j = 1; j < n; ++j) {
if(matrix[i][j] == 0) {
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
for(int i = 1; i < m; ++i) {
if(matrix[i][0] != 0) continue;
for(int j = 0; j < n; ++j) {
matrix[i][j] = 0;
}
}
for(int j = 1; j < n; ++j) {
if(matrix[0][j] != 0) continue;
for(int i = 0; i < m; ++i) {
matrix[i][j] = 0;
}
}
if(flag_0c) {
for(int i = 0; i < m; ++i) matrix[i][0] = 0;
}
if(flag_0r) {
for(int j = 0; j < n; ++j) matrix[0][j] = 0;
}
}
};