Implementação de Busca Binária e Remoção de Elementos em Arrays com Python

Problema 704: Busca Binária

Dado um array ordenado em ordem crescente com n elementos inteiros nums e um valor-alvo target, implemente uma função para buscar o target no array. Retorne o índice se encontrado, caso contrário retorne -1.

Solução com Força Bruta

class Solution:
    def search(self, nums, target):
        contador = 0
        for pos in range(len(nums)):
            if nums[pos] == target:
                return pos
            contador += 1
        return -1 if contador == len(nums) else -1

Algoritmo de Busca Binária

A busca binária é eficiente para arrays ordenados, com complexidade O(log n). O processo envolve definir dois ponteiros, comparar o elemento central e reduzir o intervalo de busca pela metade a cada iteração.

Intervalo Fechado-Fechado

class Solution:
    def search(self, nums, target):
        inicio = 0
        fim = len(nums) - 1
        while inicio <= fim:
            meio = (inicio + fim) // 2
            if nums[meio] == target:
                return meio
            elif nums[meio] < target:
                inicio = meio + 1
            else:
                fim = meio - 1
        return -1

Intervalo Fechado-Aberto

class Solution:
    def search(self, nums, target):
        inicio = 0
        fim = len(nums)
        while inicio < fim:
            meio = (inicio + fim) // 2
            if nums[meio] == target:
                return meio
            elif nums[meio] < target:
                inicio = meio + 1
            else:
                fim = meio
        return -1

O método escolhido depende da definição dos limites, afetando as condições de parada e atualização dos ponteiros.

Problema 27: Remover Elemento

Considere um array nums e um valor val. Remova todas as ocorrências de val in-place e retorne o número de elementos restantes. A ordem dos elementos pode mudar.

Solução Inicial e Erros

class Solution:
    def removeElement(self, nums, val):
        contagem = 0
        for idx in range(len(nums)):
            pos = idx - contagem
            if nums[pos] == val:
                nums.pop(pos)
                contagem += 1
        return contagem, nums

Esta abordagem falha porque o LeetCode espera apenas o comprimento como retorno, não uma tupla. O array é modificado in-place, e a plataforma valida os primeiros k eelmentos após a chamada da função.

Método de Força Bruta

class Solution:
    def removeElement(self, nums, val):
        escrita = 0
        for leitura in range(len(nums)):
            if nums[leitura] != val:
                nums[escrita] = nums[leitura]
                escrita += 1
        return escrita

Aqui, escrita rastreia a posição para o próximo elemento válido, sobrescrevendo o array diretamente.

Técnica de Dois Ponteiros

Ponteiro Rápido e Lento

class Solution:
    def removeElement(self, nums, val):
        rapido = 0
        lento = 0
        tamanho = len(nums)
        while rapido < tamanho:
            if nums[rapido] != val:
                nums[lento] = nums[rapido]
                lento += 1
            rapido += 1
        return lento

O ponteiro rapido percorre o array, enquanto lento mantém a posição dos elementos válidos.

Pontieros Bidirecionais

class Solution:
    def removeElement(self, nums, val):
        n = len(nums)
        esquerda, direita = 0, n - 1
        while esquerda <= direita:
            while esquerda <= direita and nums[esquerda] != val:
                esquerda += 1
            while esquerda <= direita and nums[direita] == val:
                direita -= 1
            if esquerda < direita:
                nums[esquerda] = nums[direita]
                esquerda += 1
                direita -= 1
        return esquerda

Nesta variante, os ponteiros convergem do início e do fim, trocando elementos para eliminar valores indesejados, reduzindo operações em certos cenários.

Tags: Python busca binária remoção de elementos algoritmos de array técnica de dois ponteiros

Publicado em 7-20 13:53