Leetcode 27: Matriz - Eliminar elementos

1. Tema

Enlace de Leetcode
Dado que tiene una matriz nums y un valor 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 de matriz adicional, debe usar solo O (1) O (1)O ( 1 ) espacio adicional y modifica la matriz de entrada en el lugar.

El orden de los elementos se puede cambiar. No necesita considerar elementos en 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 en nums son ambos 2. No necesita considerar 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 debe devolver la nueva longitud 5, y los primeros cinco elementos en nums son 0, 1, 3 , 0, 4.

2. Idea

2.1 Solución violenta

La solución violenta a este problema son dos capas de bucles for, un bucle for atraviesa los elementos de la matriz y el segundo bucle for actualiza la matriz.

inserte la descripción de la imagen aquí

  • Complejidad del tiempo: O ( n 2 ) O(n^2)O ( n2 )
  • Complejidad del espacio: O ( 1 ) O(1)O ( 1 )

2.2 Método de doble puntero

El puntero rápido atraviesa la matriz y el puntero lento actualiza la matriz
inserte la descripción de la imagen aquí

  • Complejidad del tiempo: O ( n ) O(n)O ( n )
  • Complejidad del espacio: O ( 1 ) O(1)O ( 1 )

3. Implementación del código

3.1 Solución violenta

class Solution {
    
    
public:
    int removeElement(vector<int>& nums, int val) {
    
    
        int size = nums.size();

        // 循环遍历数组元素
        for (int i = 0; i < size; i++){
    
    
            if (nums[i] == val){
    
    
                // 循环更新数组元素
                for(int j = i + 1; j < size; j++){
    
    
                    nums[j - 1] = nums[j]; // 注意这里需要更新(删除)的元素从i位置开始
                }
                // 删除一个元素之后,数组的长度-1, (i+1)位置的元素移到了i位置
                i--;
                size--;
            }
        }
        return size;

    }
};

3.2 Método de doble puntero

class Solution {
    
    
public:
    int removeElement(vector<int>& nums, int val) {
    
    
        int fastIndex = 0;
        int slowIndex;

        // fastIndex遍历数组元素
        for (slowIndex = 0; fastIndex < nums.size(); fastIndex++){
    
    
            if(nums[fastIndex] != val){
    
    
                // slowIndex更新数组元素
                nums[slowIndex] = nums[fastIndex];
                slowIndex++;
            }
        }

        return slowIndex;
        

    }
};

Supongo que te gusta

Origin blog.csdn.net/weixin_46297585/article/details/122573399
Recomendado
Clasificación