Resumen de problemas de doble puntero:
- Quitar elemento
Dada una matriz de nums y un valor de val, debe eliminar todos los elementos cuyo valor sea igual a val en su lugar y devolver la nueva longitud de la matriz eliminada.
No use espacio adicional en la matriz, debe usar solo O (1) espacio adicional y modificar la matriz de entrada in situ.
El orden de los elementos se puede cambiar. No necesita considerar los elementos de la matriz más allá de la nueva longitud.
Ejemplo 1:
Dado nums = [3,2,2,3], val = 3, la
función debe devolver la nueva longitud 2, y los dos primeros elementos de nums son 2.
No necesita considerar los elementos de la matriz más allá de la nueva longitud.
Respuesta:
punteros dobles:
ideas
Dado que el problema requiere que eliminemos todos los elementos de un valor dado en su lugar, debemos usar O (1) O (1) espacio extra para resolverlo. ¿Cómo resolver? Podemos mantener dos punteros i y j, donde i es un puntero lento y j es un puntero rápido.
algoritmo
Cuando nums [j] es igual al valor dado, incremente j para omitir el elemento. Siempre que nums [j] no sea igual a val, asigne nums [j] a nums [i] e incremente dos índices al mismo tiempo. Repita este proceso hasta que j llegue al final de la matriz y la nueva longitud de la matriz sea i.
class Solution {
public int removeElement(int[] nums, int val) {
int i=0;
for (int j=0; j< nums.length; j++) {
if (nums[j] != val) {
nums[i] = nums[j];
i++;
}
}
return i;
}
}
- Eliminación de elementos duplicados en
una matriz ordenada Dada una matriz ordenada, debe eliminar los elementos repetidos en su lugar, de modo que cada elemento solo aparezca una vez y devolver la nueva longitud de la matriz eliminada.
No utilice espacio adicional en la matriz, debe modificar la matriz de entrada in situ y completar con O (1) espacio adicional.
Ejemplo 1:
Dado el array nums = [1,1,2], la
función debería devolver la nueva longitud 2, y los dos primeros elementos del array original nums se modifican a 1, 2.
No necesita considerar los elementos de la matriz más allá de la nueva longitud.
Respuesta: Después de
ordenar la matriz, podemos colocar dos punteros i y j, donde i es un puntero lento y j es un puntero rápido. Siempre que nums [i] = nums [j], aumentamos j para omitir los duplicados.
Cuando nos encontramos con nums [j] = nums [i], la operación de saltar duplicados ha finalizado, por lo que debemos copiar su valor (nums [j]) a nums [i + 1]. Luego incrementa i, y luego repetiremos el mismo proceso nuevamente hasta que j llegue al final de la matriz.
class Solution {
public int removeDuplicates(int[] nums) {
int i=0;
for (int j=1; j<nums.length; j++) {
if (nums[i] != nums[j]) {
nums[i+1] = nums[j];
i++;
}
}
return i+1;
}
}