LeetCode: 448. Buscar todos los números desaparecidos en una matriz: análisis y código (Java)

LeetCode-448. Buscar todos los números desaparecidos en una matriz [Buscar todos los números desaparecidos en una matriz] -Análisis y código [Java]

1. Título

Dada una matriz de enteros con un rango de 1 ≤ a [i] ≤ n (n = tamaño de matriz), algunos elementos de la matriz aparecen dos veces y algunos solo una vez.
Encuentre todos los números en el rango [1, n] que no aparecen en la matriz.
¿Puede realizar esta tarea sin utilizar espacio adicional y la complejidad de tiempo es O (n)? Puede asumir que la matriz devuelta no está incluida en el espacio adicional.

Ejemplo:

输入:
[4,3,2,7,8,2,3,1]

输出:
[5,6]

Fuente: LeetCode (LeetCode)
Enlace: https://leetcode-cn.com/problems/find-all-numbers-disappeared-in-an-array
Copyright es propiedad de LeetCode . Para reimpresiones comerciales, comuníquese con la autorización oficial. Para reimpresiones no comerciales, indique la fuente.

Dos, análisis y código

1. Marca negativa

(1) Pensando

Combinando las características de la pregunta, el rango de números de la matriz de enteros es [1, n], y el rango de subíndices de la matriz es [0, n-1], por lo que puede marcar directamente el número de subíndices +1 a través de posición correspondiente del subíndice.
Para evitar la interferencia a los números no recorridos durante el proceso de marcado, el número de la posición a marcar se puede seleccionar como un valor negativo, que puede registrar la existencia del número sin afectar el proceso de recorrido posterior.

(2) Código

class Solution {
    
    
    public List<Integer> findDisappearedNumbers(int[] nums) {
    
    
        List<Integer> ans = new ArrayList<>();
        if (nums.length == 0)
            return ans;
        
        for (int val : nums) {
    
    
            int num = (val > 0) ? val : -val;
            if (nums[--num] > 0)
                nums[num] = -nums[num];
        }

        for (int i = 0; i < nums.length; i++) {
    
    
            if (nums[i] > 0)
                ans.add(i + 1);
        }
        
        return ans;
    }
}

(3) Resultados

Tiempo de ejecución: 6 ms, superando al 89,31% de los usuarios
en todas las presentaciones de Java ; consumo de memoria: 48 MB, superando al 27,98% de los usuarios en todas las presentaciones de Java.

Tres, otro

Nada.

Supongo que te gusta

Origin blog.csdn.net/zml66666/article/details/112688695
Recomendado
Clasificación