LeetCode 27. Eliminar elementos (C ++)

Problema:
Dada una matriz de números y un valor de val, debe eliminar todos los elementos con un valor igual a val in situ y devolver la nueva longitud de la matriz después de la eliminación.
No use espacio de matriz adicional, debe modificar la matriz de entrada en su lugar y hacerlo con O (1) espacio adicional.
El orden de los elementos se puede cambiar. No necesita considerar los elementos en la matriz más allá de la nueva longitud.

Ejemplo 1:

Dado nums = [3,2,2,3], val = 3, la
función debería devolver una nueva longitud de 2, y los dos primeros elementos en nums son ambos 2.
No necesita considerar los elementos en la matriz más allá de la nueva longitud.

Ejemplo 2

Dado nums = [0,1,2,2,3,0,4,2], val = 2, la
función debería devolver una nueva longitud de 5, y los primeros cinco elementos en nums son 0, 1, 3, 0 4.
Tenga en cuenta que estos cinco elementos pueden estar en cualquier orden.
No necesita considerar los elementos en la matriz más allá de la nueva longitud.

Explicación:
¿Por qué el valor devuelto es un entero, pero la respuesta a la salida es una matriz?
Tenga en cuenta que la matriz de entrada se pasa por "referencia", lo que significa que la persona que llama puede modificar la matriz de entrada en la función.
Puede imaginar la operación interna de la siguiente manera:

// nums se pasa por "referencia". En otras palabras, no haga copias de los parámetros reales
int len ​​= removeElement (nums, val);
// Modificar la matriz de entrada en la función es visible para la persona que llama.
// Según la longitud devuelta por su función, imprimirá todos los elementos en el rango de longitud en la matriz.
for (int i = 0; i <len; i ++) {
print (nums [i]);
}

Ideas para resolver problemas:
He pensado en este problema durante mucho tiempo. Parece ser un problema simple, pero lo he pensado durante mucho tiempo. . .
Originalmente quería atravesar directamente, y luego borrarlo, pero pensé que el método de borrado debería tomar tiempo (el resultado fue probado, y descubrí que es casi lo mismo que la emisión de doble puntero), así que todavía pienso en
el doble puntero después de otros métodos , pero siempre lo hago Si no salía, fui a ver la solución y de repente me di cuenta. . . Pienso demasiado .
Resumen de la experiencia:
además de los punteros duales que se mueven hacia adentro desde ambos extremos, el mismo extremo se mueve juntos (apuntando punteros rápidos y lentos)

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int i=0;
        for(int j=0;j<nums.size();j++){
            if(nums[j] != val){
                nums[i] = nums[j];
                i++;
            }
        }
        return i;
    }
};
Publicados 111 artículos originales · ganado elogios 2 · Vistas 3533

Supongo que te gusta

Origin blog.csdn.net/m0_38088647/article/details/101793798
Recomendado
Clasificación