pregunta diaria de leetcode - 80. Eliminar duplicados en una matriz ordenada II (entrevista clásica de 150 preguntas)

1. Descripción del tema y requisitos

80. Eliminar duplicados en Sorted Array II - LeetCode

Tema Descripción

Dada una matriz ordenada nums , elimine los elementos repetidos en su lugar , de modo que los elementos que aparecen más de dos veces aparezcan solo dos veces y devuelvan la nueva longitud de la matriz eliminada.

No use espacio de matriz adicional , debe modificar la matriz de entrada en el lugar y hacerlo usando O (1) espacio adicional.

ejemplo

Ejemplo 1:

输入:nums = [1,1,1,2,2,3]
输出:5, nums = [1,1,2,2,3]
解释:函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。 不需要考虑数组中超出新长度后面的元素。

Ejemplo 2:

输入:nums = [0,0,1,1,1,1,2,3,3]
输出:7, nums = [0,0,1,1,2,3,3]
解释:函数应返回新长度 length = 7, 并且原数组的前五个元素被修改为 0, 0, 1, 1, 2, 3, 3 。 不需要考虑数组中超出新长度后面的元素。

pista

  • 1 <= nums.length <= 3 * 104
  • -104 <= nums[i] <= 104
  • nums ordenado ascendente

2. Ideas para resolver problemas

Idea general:

       Primero analice el tema. El tema dice que dada una matriz ordenada, debemos eliminar los elementos que aparecen más de dos veces en la matriz, y solo podemos modificar la matriz original y no podemos tomar prestadas matrices adicionales. Finalmente, debemos devolver la nueva longitud de la matriz.

       En primer lugar, queremos eliminar los elementos que aparecen más de dos veces en la matriz, luego debemos recorrer toda la matriz, pero ¿cómo encontrar los elementos que aparecen más de dos veces y eliminarlos? La idea más simple es comparar cada elemento con los siguientes elementos a su vez, y luego contar el número de veces y modificarlo si el número de ocurrencias es mayor a 2 durante la comparación, pero este método de implementación necesita usar bucles anidados, y el la complejidad del espacio es relativamente alta y más complicada de implementar. Por lo tanto, podemos pensar en el método de "doble puntero", es decir, usar dos punteros para recorrer y actualizar los elementos del arreglo. Por lo tanto, podemos definir dos variables, una se usa para atravesar la matriz y la otra se usa para registrar la longitud de la matriz actualizada y actualizar la matriz.

       Luego, analicemos la situación de la matriz. Para el número de elementos de la matriz menor o igual a 2, la longitud de la matriz se puede devolver directamente. Debido a que debemos asegurarnos de que cada elemento solo aparezca dos veces, debemos comparar el primer elemento con el tercer elemento (porque el título dice que es una matriz ordenada), y si son iguales, significa el número de ocurrencias del elemento actual Es mayor que 2, por lo que el puntero transversal se moverá hacia atrás, encontrará el elemento que no es igual al elemento anterior, luego asígnelo y luego actualice la longitud modificada de la matriz (es decir, el puntero de actualización se mueve hacia atrás un bit) . Por lo tanto, el valor inicial de los dos punteros es 2, y cada comparación se realiza comparando el elemento al que apunta el puntero transversal con el segundo elemento delante del elemento al que apunta el puntero de actualización (el segundo de derecha a izquierda) .

[El siguiente es un ejemplo para analizar los cambios de dos punteros]

Pasos específicos:

① Determine si la longitud de la matriz es mayor que 2

② Inicializar dos punteros

③Atraviesa la matriz y actualízala

④ Devuelve la longitud de la matriz actualizada


3. Código específico [lenguaje C]

int removeDuplicates(int* nums, int numsSize){
    if(numsSize<=2)  return numsSize;
    int left = 2, right = 2;//有序数组,每个元素只出现两次,因此right从下标2开始遍历
    //while的执行条件为right<numsSize,即未遍历完数组
    while (right < numsSize) {
        //比较当前位置的元素与自己前面第二个元素是否相等
        //如果相等则需要继续向后面找新的元素替代掉当前位置的元素
        //如果不相等则将此时right所指向的元素赋值给left所指向的元素
        //left就是修改后的数组长度,而right是用来遍历访问整个数组的
        if (nums[left - 2] != nums[right]) {
            nums[left] = nums[right];
            ++left;
        }
        ++right;
    }
    return left;
}

Supongo que te gusta

Origin blog.csdn.net/m0_59800431/article/details/131524729
Recomendado
Clasificación