Adquira o hábito de escrever juntos! Este é o 14º dia da minha participação no "Nuggets Daily New Plan·April Update Challenge", clique para ver os detalhes do evento .
tema
** 73. Zero de matriz**
Dada uma matriz mxn, se um elemento for 0, defina todos os elementos em sua linha e coluna como 0. Por favor, use um algoritmo no local.
Exemplo 1:
输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]
复制代码
Exemplo 2:
输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]
复制代码
dica:
m == matrix.length
n == matrix[0].length
1 <= m, n <= 200
-231 <= matrix[i][j] <= 231 - 1
复制代码
Avançado:
Uma solução intuitiva é usar espaço extra de O(mn), mas essa não é uma boa solução.
Uma melhoria simples seria usar espaço extra O(m + n), mas ainda não é a melhor solução.
Você pode encontrar uma solução que use apenas espaço constante?
responda
análise de resolução de problemas
Ideias para resolver problemas
Como registrar usando uma variável de tag
Podemos otimizar ainda mais o segundo método, usando apenas uma variável marcadora para registrar se a primeira coluna originalmente tem 0. Desta forma, o primeiro elemento da primeira coluna pode marcar se há um 0 na primeira linha. Mas para evitar que o primeiro elemento de cada coluna seja atualizado antecipadamente, precisamos processar os elementos da matriz na ordem inversa, começando pela última linha.
a complexidade
Complexidade de tempo O(M * N)
Complexidade de espaço O(1)
código de resolução de problemas
O código da solução é o seguinte (comentários detalhados no código):
class Solution {
public void setZeroes(int[][] matrix) {
int m = matrix.length, n = matrix[0].length;
boolean flagCol0 = false;
for (int i =0; i < m; i++) {
if (matrix[i][0] == 0) {
flagCol0 = true;
}
for (int j =1; j <n; j++) {
if (matrix[i][j] == 0) {
matrix[i][0] = matrix[0][j] = 0;
}
}
}
for (int i = m-1; i >=0; i--) {
for (int j = 1; j<n; j++) {
if (matrix[i][0] == 0 || matrix[0][j] == 0) {
matrix[i][j] = 0;
}
}
if (flagCol0) {
matrix[i][0] = 0;
}
}
}
}
复制代码
Resultados do feedback após o envio (porque este tópico não foi otimizado, o desempenho é médio):