Logo

dev-resources.site

for different kinds of informations.

A técnica dos dois ponteiros

Published at
1/15/2025
Categories
go
twopointer
leetcode
algorithms
Author
joaofilippe
Categories
4 categories in total
go
open
twopointer
open
leetcode
open
algorithms
open
Author
11 person written this
joaofilippe
open
A técnica dos dois ponteiros

Maximização da Área do Contêiner com Dois Ponteiros em Go

Ao resolver problemas que envolvem arrays ou listas, a técnica dos dois ponteiros é uma estratégia poderosa e eficiente. Neste artigo, vamos explorar como usar essa técnica para resolver o problema "Container With Most Water", que envolve encontrar a área máxima entre duas linhas verticais em um gráfico.

Enunciado do Problema

Dado um array de inteiros não negativos onde cada inteiro representa a altura de uma linha vertical em um gráfico, encontre duas linhas que, junto com o eixo x, formem um contêiner que contenha a maior quantidade de água.

Exemplo

Vamos considerar o array height = [1, 8, 6, 2, 5, 4, 8, 3, 7]. O objetivo é encontrar as duas linhas que formam o contêiner com a área máxima.

Técnica dos Dois Ponteiros

A técnica dos dois ponteiros envolve inicializar dois ponteiros no início e no final do array e movê-los em direção um ao outro para encontrar a solução ideal.

Explicação Passo a Passo

  1. Inicialização:

    • maxArea é inicializado como 0 para armazenar a maior área encontrada.
    • Dois ponteiros, l (esquerda) e r (direita), são inicializados no início e no final do array, respectivamente.
  2. Iteração:

    • Enquanto l for menor que r, o loop continua.
    • A área entre as linhas nos índices l e r é calculada como min(height[l], height[r]) * (r - l).
    • maxArea é atualizado se a área calculada for maior que o valor atual de maxArea.
  3. Movimento dos Ponteiros:

    • Para potencialmente encontrar uma área maior, o ponteiro que aponta para a linha mais curta é movido:
      • Se height[l] for menor que height[r], incremente l.
      • Caso contrário, decremente r.
  4. Retorno:

    • Quando os ponteiros se encontram, o loop termina, e maxArea é retornado como a maior área encontrada.

Exemplo Passo a Passo

Vamos percorrer o exemplo height = [1, 8, 6, 2, 5, 4, 8, 3, 7] passo a passo:

  1. Inicialização:

    • maxArea = 0
    • Ponteiros: l = 0 (altura 1) e r = 8 (altura 7)
  2. Primeira Iteração:

    • Área: min(1, 7) * (8 - 0) = 1 * 8 = 8
    • Atualiza maxArea: maxArea = max(0, 8) = 8
    • Move l (já que height[l] < height[r]): l = 1
  3. Segunda Iteração:

    • Ponteiros: l = 1 (altura 8) e r = 8 (altura 7)
    • Área: min(8, 7) * (8 - 1) = 7 * 7 = 49
    • Atualiza maxArea: maxArea = max(8, 49) = 49
    • Move r: r = 7
  4. Terceira Iteração:

    • Ponteiros: l = 1 (altura 8) e r = 7 (altura 3)
    • Área: min(8, 3) * (7 - 1) = 3 * 6 = 18
    • maxArea permanece 49
    • Move r: r = 6
  5. Quarta Iteração:

    • Ponteiros: l = 1 (altura 8) e r = 6 (altura 8)
    • Área: min(8, 8) * (6 - 1) = 8 * 5 = 40
    • maxArea permanece 49
    • Move r: r = 5
  6. Quinta Iteração:

    • Ponteiros: l = 1 (altura 8) e r = 5 (altura 4)
    • Área: min(8, 4) * (5 - 1) = 4 * 4 = 16
    • maxArea permanece 49
    • Move r: r = 4
  7. Sexta Iteração:

    • Ponteiros: l = 1 (altura 8) e r = 4 (altura 5)
    • Área: min(8, 5) * (4 - 1) = 5 * 3 = 15
    • maxArea permanece 49
    • Move r: r = 3
  8. Sétima Iteração:

    • Ponteiros: l = 1 (altura 8) e r = 3 (altura 2)
    • Área: min(8, 2) * (3 - 1) = 2 * 2 = 4
    • maxArea permanece 49
    • Move r: r = 2
  9. Oitava Iteração:

    • Ponteiros: l = 1 (altura 8) e r = 2 (altura 6)
    • Área: min(8, 6) * (2 - 1) = 6 * 1 = 6
    • maxArea permanece 49
    • Move r: r = 1
  10. Fim do Loop:

    • Os ponteiros se encontram (l = r), então o loop termina.

O valor final de maxArea é 49, que é a maior área possível entre duas linhas no array height.

Solução em Go

Aqui está o código completo em Go implementando a técnica dos dois ponteiros:

package maxarea

func maxArea(height []int) int {
    maxArea := 0
    l, r := 0, len(height)-1

    for l < r {
        maxArea = max(maxArea, min(height[l], height[r])*(r-l))
        if height[l] < height[r] {
            l++
        } else {
            r--
        }
    }

    return maxArea
}
Enter fullscreen mode Exit fullscreen mode

Conclusão

A técnica dos dois ponteiros é uma ferramenta poderosa para resolver problemas que envolvem arrays ou listas. Movendo os ponteiros de forma inteligente, podemos encontrar a solução ideal de maneira eficiente.

No problema "Container With Most Water", essa técnica nos permite encontrar a área máxima entre duas linhas em tempo linear

go Article's
30 articles in total
Favicon
A técnica dos dois ponteiros
Favicon
Preventing SQL Injection with Raw SQL and ORM in Golang
Favicon
🐹 Golang Integration with Kafka and Uber ZapLog 📨
Favicon
🌐 Building Golang RESTful API with Gin, MongoDB 🌱
Favicon
Golang e DSA
Favicon
Prevent Race Conditions Like a Pro with sync.Mutex in Go!
Favicon
tnfy.link - What's about ID?
Favicon
Developing a Simple RESTful API with Gin, ginvalidator, and validatorgo
Favicon
Desbravando Go: Capítulo 1 – Primeiros Passos na Linguagem
Favicon
Compile-Time Assertions in Go (Golang)
Favicon
Mastering GoFrame Logging: From Zero to Hero
Favicon
GoFr: An Opinionated Microservice Development Framework
Favicon
The Struggle of Finding a Free Excel to PDF Converter: My Journey and Solution
Favicon
Setting Up Your Go Environment
Favicon
External Merge Problem - Complete Guide for Gophers
Favicon
Mastering Go's encoding/json: Efficient Parsing Techniques for Optimal Performance
Favicon
Golang with Colly: Use Random Fake User-Agents When Scraping
Favicon
Versioning in Go Huma
Favicon
Go Basics: Syntax and Structure
Favicon
Interesting feedback on Fuego!
Favicon
Making Beautiful API Keys
Favicon
Building a Semantic Search Engine with OpenAI, Go, and PostgreSQL (pgvector)
Favicon
Go's Concurrency Decoded: Goroutine Scheduling
Favicon
Golang: Struct, Interface And Dependency Injection(DI)
Favicon
Desvendando Subprocessos: Criando um Bot de Música com Go
Favicon
go
Favicon
🚀 New Article Alert: Master sync.Pool in Golang! 🚀
Favicon
Week Seven Recap of #100DaysOfCode
Favicon
Ore: Advanced Dependency Injection Package for Go
Favicon
Golang vs C++: A Modern Alternative for High-Performance Applications

Featured ones: