42. 接雨水

题目链接

解题思路:使用首尾指针。比较数组两侧的值,以数值较小的一侧的高度作为当前位置(L或R)两侧的堤坝,从而计算出当前位置的雨水量(因为雨水量的瓶颈是较低一侧的高度),并且更新首尾指针路过数字的最大值。然后历史最大值较小的一侧的指针向数组中心移动,直到首尾指针相遇。

C++:

int Water4(const vector<int>& array) {
    size_t arr_len = array.size();
    if (arr_len <= 2) return 0;

    int L = 1;
    int R = arr_len - 2;
    int left_max = array[0];
    int right_max = array[arr_len - 1];
    int water = 0;
    while (L <= R) {
        if (left_max <= right_max) {
            water += max(left_max - array[L], 0);
            left_max = max(left_max, array[L++]);
        } else {
            water += max(right_max - array[R], 0);
            right_max = max(right_max, array[R--]);
        }
    }
    return water;
}

原文地址:https://www.cnblogs.com/pursuiting/p/14597938.html