26. Remove Duplicates from Sorted Array
https://leetcode.com/problems/remove-duplicates-from-sorted-array/description
Definição
Intuição
A ideia é encontrar o próximo elemento que seja diferente do elemento atual . Uma vez que a lista já está ordernada, é garantido que . Dessa forma, quando , aplicamos as seguintes operações:
Este processo se repete enquanto , isto é, enquanto é um índice válido.
Ilustração
Estado inicial
e começam apontando para o primeiro e o segundo elementos, respectivamente. É seguro fazer apontar para o segundo elemento, mesmo para uma lista de um único elemento, porque a condição de parada é . Para listas de tamanho 1, essa condição será quebrada e o algoritmo para porque .
1ª iteração
avança tentando encontrar um elemento diferente de
2ª iteração
avança e agora aponta para um elemento diferente de
Agora copiamos para e incrementamos ambos os ponteiros
3ª iteração
avança e agora aponta para um elemento diferente de
Agora copiamos para e incrementamos ambos os ponteiros
4ª iteração
Como e , o algoritmo termina e retorna o tamanho da lista resultante, neste caso . Portanto, a resposta final é um array de tamanho 3:
Implementação
Clique para revelar a implementação
class Solution:
def removeDuplicates(self, nums: list[int]) -> int:
left_index, right_index = 0, 1
n = len(nums)
while right_index < n:
left, right = nums[left_index], nums[right_index]
if left != right:
left_index += 1
nums[left_index] = right
right_index += 1
return left_index + 1
Testes
import pytest
from .solution import Solution
@pytest.mark.parametrize('numbers,expected', [
([1, 1, 1, 2, 2, 3, 3], [1, 2, 3])
])
def test_solution(numbers, expected):
new_size = Solution().removeDuplicates(numbers)
assert numbers[:new_size] == expected
Complexidade de tempo
Como a lista é iterada por completo da esquerda para a direita através do ponteiro , a complexidade é
Complexidade de espaço
Como a lista é modificada in-place e nenhuma alocação além de variáveis auxiliares é feita, a complexidade é