Decifrando o método do ponteiro duplo: como encontrar uma solução elegante para o maior problema de enchimento de água usando dois ponteiros

Link do tópico: O recipiente que contém mais água

Mudando a pergunta, queremos descobrir a quantidade máxima de água que pode ser retida em um recipiente formado por duas linhas verticais em um determinado arranjo de linhas verticais. Este problema pode ser 双指针法resolvido de forma eficiente usando .

Método de ponteiro duplo para resolver o maior problema de contêiner

  • Descrição do problema : Dada uma altura de array de alturas de linhas verticais, o subscrito de array i indica a posição da i-ésima linha vertical, e height[i] indica a altura da linha vertical.

  • Objetivo : Encontre duas linhas verticais de modo que o recipiente que elas formam com o eixo x possa conter a quantidade máxima de água.

  • Idéia do método de ponteiro duplo : use dois ponteiros i e j, apontando para 起始a soma do array respectivamente 末尾. Calcula a área do container formada pelas duas linhas verticais apontadas pelo ponteiro atual, ou seja 面积 = min(height[i], height[j]) * (j - i). Mova o ponteiro apontando para uma vertical mais curta na esperança de encontrar uma vertical mais alta, aumentando assim a altura do contêiner. Porque a largura da borda inferior diminuirá, mas o aumento da altura pode compensar a diminuição da largura, resultando em uma área maior. Repita esse processo até que os dois ponteiros se encontrem.

  • Implementação de código (C++):

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

Explicação sobre "mover a linha vertical"

Na verdade, não importa qual ponteiro se mova, a largura da borda inferior diminui .

Mas se movermos 较短o ponteiro correspondente à linha vertical, é possível obter uma área maior mantendo a altura .增加底边的宽度

A correção dessa abordagem é que não perdemos uma área possivelmente maior, pois a cada passo estamos indo 可能更大em direção à altura de , não à largura da base.

Esta é a aplicação do método do ponteiro duplo na solução do maior problema de contêiner. Usando essa abordagem, podemos encontrar o recipiente que pode conter a quantidade máxima de água em complexidade de tempo linear.

Análise de Complexidade

  • Complexidade de tempo: O(N)- onde N é o comprimento do array, já que percorremos o array no máximo uma vez.
  • Complexidade do espaço: O(1)- porque apenas algumas variáveis ​​extras constantes são usadas.

Supongo que te gusta

Origin blog.csdn.net/qq_22841387/article/details/132159476
Recomendado
Clasificación