[Avanço no tópico do algoritmo] Ponteiro duplo - o recipiente que contém mais água (4)

Índice

1. Análise de tópico

2. Princípio do algoritmo

3. Escrita de código

Escreva no final:


1. Análise de tópico

Link do tópico: 11. O recipiente que contém mais água - Leetcode 

 Este tópico não é difícil de entender,

A capacidade hídrica dos pilares de ambos os lados é determinada pelos pilares do lado curto.

A capacidade de retenção de água é apenas a altura x largura da coluna curta.

2. Princípio do algoritmo

 Esta questão pode ser enumerada violentamente, e o loop for de duas camadas pode definitivamente encontrar a capacidade máxima de água.

Mas sendo um problema médio, o uso da violência irá expirar, por isso temos que pensar numa solução melhor.

 Vamos observar as regras:

Tome esta figura como exemplo;

Se deixarmos a parte superior esquerda passar para a direita, haverá duas situações:

1. Se a coluna da direita for mais alta, mas a largura diminuir, a capacidade de retenção de água diminui,

2. Se a coluna da direita for mais curta e a largura diminuir, a capacidade de retenção de água diminui.

Obviamente não está funcionando,

Então, se deixarmos a direita mais curta passar para a esquerda, haverá duas situações:

1. Se a coluna da esquerda for mais alta e a largura diminuir, a capacidade de retenção de água pode ser menor, pode permanecer a mesma ou pode ser maior,

2. Se a coluna da esquerda for mais curta, a largura diminui e a capacidade de retenção de água diminui.

A julgar pelas duas situações acima, podemos atravessar continuamente os pilares do lado curto para o meio,

Registre o valor máximo que ocorre a cada vez. Após percorrer, podemos obter o valor máximo.

E só o percorremos uma vez, então a complexidade do tempo é otimizada para O(N),

O método específico é usar ponteiros duplos para manter ambos os lados. 

3. Escrita de código

class Solution {
public:
    int maxArea(vector<int>& height) {
        int left = 0, right = height.size() - 1, maxVal = 0;
        while(left < right) {
            maxVal = max(maxVal, min(height[left], height[right]) * (right - left));
            if(height[left] < height[right]) left++;
            else right--;
        }
        return maxVal;
    }
};

Escreva no final:

O texto acima é o conteúdo deste artigo, obrigado pela leitura.

Se você acha que ganhou algo, pode dar um like no blogueiro .

Se houver omissões ou erros no conteúdo do artigo, envie uma mensagem privada ao blogueiro ou indique na área de comentários ~

Acho que você gosta

Origin blog.csdn.net/Locky136/article/details/131568535
Recomendado
Clasificación