Postagem em destaque

BalckTDN :: LeetCode :: Container With Most Water (Harbour & TLPP)

_Créditos das imagens: ChatGPT_

# LeetCode :: Container With Most Water (Harbour & TLPP)

O problema [**"Container With Most Water"**](https://leetcode.com/problems/container-with-most-water/), do LeetCode, requer encontrar o maior volume de água que pode ser contido entre duas linhas verticais em um gráfico. O desafio está em otimizar a busca para que a solução seja eficiente, preferencialmente em \(O(n)\).

### Descrição do Problema

Dado um array de inteiros \(height\), onde cada elemento representa a altura de uma linha vertical no gráfico:

1. Escolha duas linhas para formar as paredes de um contêiner.
2. O volume de água que o contêiner pode conter é determinado pelo menor dos dois valores entre as alturas escolhidas multiplicado pela distância entre elas.

O objetivo é retornar o maior volume de água que pode ser armazenado.

### Exemplo

Para \(height = [1,8,6,2,5,4,8,3,7]\):
- O maior volume de água possível é \(49\), formado pelas alturas \(8\) e \(7\), com distância \(7\).

---

### Solução Otimizada em \(O(n)\)

A abordagem ideal utiliza dois ponteiros (um no início e outro no final do array) que convergem para o centro, maximizando o volume durante a busca.

#### Passos:
1. Inicialize dois ponteiros: um no início (\(i = 0\)) e outro no final (\(j = n-1\)).
2. Calcule o volume do contêiner formado pelas alturas \(height[i]\) e \(height[j]\).
3. Atualize o maior volume encontrado.
4. Mova o ponteiro correspondente à menor altura (para tentar encontrar uma altura maior).
5. Repita até que os ponteiros se encontrem.

---

### Implementação em Harbour & TLPP

1. Versão 1: Loop while.
2. Versão 2: Loop for.
3. Versão 3: Loop com aEval.

Aqui (👇) estão as implementações desse algoritmo em Harbour: 

[container.with.most.water.11.1.prg](https://github.com/naldodj/naldodj-xbase-leetcode-solutions/blob/main/src/hb/011/container.with.most.water.11.1.prg)
[container.with.most.water.11.2.prg](https://github.com/naldodj/naldodj-xbase-leetcode-solutions/blob/main/src/hb/011/container.with.most.water.11.2.prg)
[container.with.most.water.11.3.prg](https://github.com/naldodj/naldodj-xbase-leetcode-solutions/blob/main/src/hb/011/container.with.most.water.11.3.prg)

Aqui (👇) estão as implementações desse algoritmo em TLPP: 

[container.with.most.water.11.1.tlpp](https://github.com/naldodj/naldodj-xbase-leetcode-solutions/blob/main/src/tlpp/011/container.with.most.water.11.1.tlpp)
[container.with.most.water.11.2.tlpp](https://github.com/naldodj/naldodj-xbase-leetcode-solutions/blob/main/src/tlpp/011/container.with.most.water.11.2.tlpp)
[container.with.most.water.11.3.tlpp](https://github.com/naldodj/naldodj-xbase-leetcode-solutions/blob/main/src/tlpp/011/container.with.most.water.11.3.tlpp)

---

### Testando as implementações: Observe as figuras 1 e 2, abaixo.

### Explicação do Código

1. **Inicialização**:
   - Os ponteiros \(nLeft\) e \(nRight\) delimitam os índices das linhas a serem comparadas.
2. **Cálculo do Volume**:
   - O volume é o menor dos valores das alturas multiplicado pela distância entre os ponteiros.
3. **Movimento dos Ponteiros**:
   - O ponteiro correspondente à menor altura é movido para o centro, pois aumentar a altura é mais promissor para encontrar um volume maior.

---

### Complexidade
- **Tempo**: \(O(n)\), pois cada índice é processado uma vez.
- **Espaço**: \(O(1)\), apenas variáveis auxiliares são usadas.

Vamos analisar cada caso para entender como o cálculo funciona.

---

### 1. **Input:** `[1,8,6,2,5,4,8,3,7]`  
**Output:** `49`  
**Expected:** `49`  
**Matched:** `true`

- **Análise:**  
  Para o maior volume, escolhemos as alturas `8` (índice 2) e `7` (índice 9).  
  A distância entre as duas alturas é `9 - 2 = 7`.  
  O volume é dado por: `Volume = min(8, 7) * 7 = 7 * 7 = 49`

Esse é o maior volume possível para este conjunto de alturas.

---

### 1. **Input:** `[1,8,6,2,5,4,8,3,7]`  
**Output:** `49`  
**Expected:** `49`  
**Matched:** `true`

- **Análise:**  
  Para o maior volume, escolhemos as alturas `8` (índice 2) e `7` (índice 9).  
  A distância entre as duas alturas é `9 - 2 = 7`.  
  O volume é dado por: `Volume = min(8, 7) * 7 = 7 * 7 = 49`

Esse é o maior volume possível para este conjunto de alturas.

---

### 2. **Input:** `[1,1]`  
**Output:** `1`  
**Expected:** `1`  
**Matched:** `true`

- **Análise:**  
  Existem apenas duas linhas, ambas de altura `1`.  
  A distância entre elas é `1` (índice 2 - índice 1 = 1).  
  O volume é dado por: `Volume = min(1, 1) * 1 = 1 * 1 = 1`
  

Como só há duas alturas, este é o único volume possível.

---

### 3. **Input:** `[3,1,2]`  
**Output:** `4`  
**Expected:** `4`  
**Matched:** `true`

- **Análise:**  
  Para o maior volume, escolhemos as alturas `3` (índice 1) e `2` (índice 3).  
  A distância entre elas é `3 - 1 = 2`.  
  O volume é dado por: `Volume = min(3, 2) * 2 = 2 * 2 = 4`

Esse é o maior volume possível.

---

### 4. **Input:** `[15,70,12,21,10,2]`  
**Output:** `45`  
**Expected:** `45`  
**Matched:** `true`

- **Análise:**  
  Para o maior volume, escolhemos as alturas `15` (índice 1) e `21` (índice 4).  
  A distância entre elas é `4 - 1 = 3`.  
  O volume é dado por: `Volume = min(15, 21) * 3 = 15 * 3 = 45`

Embora a altura `70` seja maior, ela não contribui para um volume maior quando comparada com outras alturas mais próximas.

Essa afirmativa refere-se a um aspecto fundamental do problema: **o volume é limitado pela menor das duas alturas escolhidas e pela distância entre elas.** Isso significa que, mesmo que uma das alturas seja muito grande, o volume pode ser pequeno se a distância for curta ou se a outra altura for significativamente menor.

Vamos detalhar isso no contexto da entrada `[15,70,12,21,10,2]`:

---

#### Comparações usando a altura `70` (índice 2):


### 1. **Análise da Altura `70`**

- A altura `70` está no índice `2` e é, de longe, a maior do array.
- Porém, para calcular o volume, precisamos considerar:
  - A menor altura entre `70` e a outra linha escolhida.
  - A distância entre essas duas linhas.

---

#### Comparações usando a altura `70` (índice 2):

1. **Com `15` (índice 1):**
   - Distância = `2 - 1 = 1`
   - `Volume = (min(70, 15) * 1 = 15 * 1 = 15)`

2. **Com `12` (índice 3):**
   - Distância = `3 - 2 = 1`
   - `Volume = (min(70, 12) * 1 = 12 * 1 = 12)`

3. **Com `21` (índice 4):**
   - Distância = `4 - 2 = 2`
   - `Volume = (min(70, 21) * 2 = 21 * 2 = 42)`

4. **Com `10` (índice 5):**
   - Distância = `5 - 2 = 3`
   - `Volume = (min(70, 10) * 3 = 10 * 3 = 30)`

5. **Com `2` (índice 6):**
   - Distância = `6 - 2 = 4`
   - `Volume = (min(70, 2) * 4 = 2 * 4 = 8)`

---

### 2. **Análise da Melhor Combinação**

Agora vamos considerar a combinação que gera o maior volume:

- A altura `15` (índice 1) combinada com a altura `21` (índice 4) tem:
  - Distância = `4 - 1 = 3`
  - `Volume = (min(15, 21) * 3 = 15 * 3 = 45)`

Embora `70` seja muito maior, ela não contribui para o maior volume porque:
1. Quando combinada com linhas próximas, a distância é curta, reduzindo o volume.
2. Quando combinada com linhas mais distantes, as alturas dessas outras linhas são muito pequenas, limitando o volume.

---

### Resumo da Afirmação

Mesmo que uma linha tenha uma altura muito grande (como `70`), ela **não garante o maior volume**. Isso ocorre porque:
- O volume é limitado pela **menor das duas alturas** escolhidas.
- O volume também depende da **distância entre as linhas**, que pode ser maior ao escolher outras combinações.

Portanto, é mais eficaz priorizar combinações que equilibrem **altura** e **distância**, mesmo que uma das alturas seja menor. Essa é a razão pela qual a altura `70` não contribui para o maior volume no exemplo dado.
---

### Conclusão

Os resultados apresentados para cada entrada correspondem ao esperado. A lógica de mover os ponteiros em direção ao centro permite otimizar a busca pelo maior volume de forma eficiente, garantindo que todos os casos sejam tratados corretamente.

---

### Hashtags

#ContainerWithMostWater, #Harbour, #TLPP, #Algorithms, #ProblemSolving, #DataStructures, #CodingChallenge, #LeetCode, #ProgrammingLogic, #EfficiencyInCode, #AlgorithmOptimization, #HarbourProgramming, #TLPPProgramming

Comentários

Postagens mais visitadas