[Algoritmo - Ponteiros Duplos] LeetCode 11 O recipiente que contém mais água

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;
    }
};

resultado:

Acho que você gosta

Origin blog.csdn.net/weixin_44906102/article/details/132396031
Recomendado
Clasificación