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.