[Pregunta de pincel] Eliminar duplicados en una matriz ordenada

Directorio de artículos de la serie

Eliminar duplicados en una matriz ordenada


inserte la descripción de la imagen aquí

prefacio

La estructura de datos es muy importante en el mundo de la programación, especialmente la entrevista en una gran fábrica es un elemento obligatorio. Hoy, llegamos al tema [Eliminar duplicados en una matriz ordenada] y lo implementaremos con código Java.

1. Tema

Dados los números de una matriz en orden ascendente, elimine los elementos repetidos en su lugar para que cada elemento aparezca solo una vez y devuelva la nueva longitud de la matriz eliminada. El orden relativo de los elementos debe ser coherente. Luego devuelve el número de elementos únicos en nums.

Teniendo en cuenta que la cantidad de elementos únicos de nums es k, debe hacer lo siguiente para asegurarse de que su solución pueda pasar:

  • Altera la matriz nums para que los primeros k elementos de nums contengan elementos únicos, en el orden en que aparecieron originalmente en nums. Los elementos restantes de nums no son significativos para el tamaño de nums.
  • devuelve k.

Fuente: leetcode
Enlace: https://leetcode.cn/problems/remove-duplicates-from-sorted-array/
Título: 26. Eliminar duplicados en una matriz ordenada

1.2 Criterios de juicio

El sistema probará su solución con el siguiente código:

int[] nums = [...]; // 输入数组
int[] expectedNums = [...]; // 长度正确的期望答案

int k = removeDuplicates(nums); // 调用

assert k == expectedNums.length;
for (int i = 0; i < k; i++) {
    
    
    assert nums[i] == expectedNums[i];
}

Si todas las afirmaciones pasan, entonces su solución pasará.

1.3 Ejemplos

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

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

2. Resolución de problemas

2.1 Búsqueda directa de puntero doble

La complejidad temporal es O(n) y la búsqueda in situ no consume espacio adicional.
inserte la descripción de la imagen aquí

2.2 Solución

Un puntero i se usa para recorrer la matriz y el otro puntero j apunta a la última posición de la matriz válida.
Solo cuando el valor señalado por i es inconsistente con j (no repetido), el valor de i se agrega a la siguiente posición de j.

class Solution {
    
    
    public int removeDuplicates(int[] nums) {
    
    
        int n = nums.length;
        int j = 0;
        for (int i = 0; i < n; i++) {
    
    
            if (nums[i] != nums[j]) {
    
    
                nums[++j] = nums[i];
            }
        }
        return j + 1;
    }
}
  • Complejidad temporal: O(n)
  • Complejidad del espacio: O(1)

2.2, eliminar en orden inverso

Esta pregunta se puede derivar por qué los datos en la colección ArrayList no se pueden eliminar positivamente en Java.
A través de la eliminación inversa, se puede garantizar que el índice/valor en la colección permanezca sin cambios, y la complejidad del tiempo también es O (n)
(cuando se elimina de forma inversa, no afectará los cambios de número de serie de otros datos)
inserte la descripción de la imagen aquí

3. Resumen

Este artículo elimina los duplicados en la matriz y devuelve la longitud del número único a través de los algoritmos de búsqueda directa de doble puntero y eliminación de orden inverso. Ninguno de estos dos algoritmos ocupa espacio adicional.

Supongo que te gusta

Origin blog.csdn.net/s445320/article/details/131375070
Recomendado
Clasificación