Trapping Rain Water

Easy C++

Enunciado do problema

Dados n inteiros não negativos representando um mapa de elevação onde a largura de cada barra é 1, calcule quanta água será retida após a chuva.

Questões importantes

Os limites do vetor também podem reter água? Não

Solução

Para resolver este problema, calcule dois arrays auxiliares contendo os valores máximos à direita e à esquerda de uma i-ésima posição. A altura menos o valor mínimo centered os dois vetores vai mostrar quanta água pode ficar presa em todas as posições do vetor. Se o valor for negativo significa que nenhuma água pode ser retida e não acrescenta à resultado.

int trap(vector<int>& height) {
    if(height.empty())
        return 0;

    vector<int> right_max(height.size(),0),left_max(height.size(),0);

    left_max[0]=height[0];
    for(int i=1;i<height.size();i++){
        left_max[i]=max(height[i],left_max[i-1]);
    }

    right_max[height.size()-1] = height.back();
    for(int j=height.size()-2;j>=0;j--){
        right_max[j]=max(height[j],right_max[j+1]);
    }

    int result = 0;
    for(int i=1;i<height.size()-1;i++){
        int water = min(left_max[i],right_max[i])-height[i];
        result+=max(water,0);
    }

    return result;
}

Complexidade de tempo: O(n)

Complexidade de espaço: O(n)


question from LeetCode