[Solución de problemas de Leetcode] problema de doble puntero

Resumen de problemas de doble puntero:

  1. 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;
    }
}
  1. 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;
    }
}

Supongo que te gusta

Origin blog.csdn.net/yearningseeker/article/details/108650440
Recomendado
Clasificación