Descrição do tópico:
Ideias para resolução de problemas:
como mostra a imagem:
1. Consideramos a área de água que as duas colunas mais distantes podem conter. A largura é a distância entre as duas colunas, 8; a altura é determinada pela menor das duas colunas, que é a altura da coluna da esquerda, 3. A área da água é 3×8=24.
2. Se você optar por consertar um pilar e trocar o outro, a área da água mudará:
- O pilar atual é o pilar dos dois lados, e a largura da água é a maior. Em outras combinações, a largura da água é menor que esta.
- A coluna da esquerda é mais curta, o que determina que a altura da água é 3. Se você mover o pilar da esquerda, a nova altura da superfície da água será incerta e nunca excederá a altura do pilar da direita, que é 7.
- Se você mover a coluna da direita, a nova altura da superfície da água não excederá a altura da coluna da esquerda em 3, ou seja, não excederá a altura atual da superfície da água.
3. Portanto, se o pilar da esquerda for fixo e o pilar da direita for movido, a altura da água não aumentará e a largura diminuirá definitivamente, então a área da água diminuirá definitivamente. Neste momento, a combinação do pilar da esquerda e qualquer outro pilar pode realmente ser eliminada. Isso significa que podemos excluir o pilar da esquerda.
4. Esta operação de exclusão da coluna da esquerda é left++ no código de ponteiro duplo. A área entre os ponteiros esquerdo e direito é a área que não foi excluída. Com a exclusão continuada, tanto a esquerda como a direita irão mover-se para o meio. Quando a esquerda e a direita se encontram, o algoritmo termina.
Código:
class Solution {
public:
int maxArea(vector<int>& height)
{
int left = 0;
int right = height.size() - 1;
int ret = 0;
while(left < right)
{
int V = (right - left) * min(height[left], height[right]);
ret = max(ret, V);
if(height[left] < height[right])
{
left++;
}
else
{
right--;
}
}
return ret;
}
};