Zero de Matriz de Estruturas e Algoritmos de Dados LeetCode

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:

imagem.png

输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]
复制代码

Exemplo 2:

imagem.png

输入: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):

imagem.png

Informação de referência

Acho que você gosta

Origin juejin.im/post/7086460772796071967
Recomendado
Clasificación