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.