Índice
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 ~