题解 | #接雨水问题#

接雨水问题

https://www.nowcoder.com/practice/31c1aed01b394f0b8b7734de0324e00f

/**
递归就完事啦:
	先判断整个数组区域是不是一整个连续接雨水的区域(即数组中的值小于数组中的左右边界)。
	是的话计算并累加雨水的量。
	不是则找出区域中间最大的值作为分割点,判断这个点两侧是否为连续接雨水的区域。
 */
#include <stdbool.h>
static long long count = 0;

void countRain(int* arr, int l, int r) {
    int tmp = arr[l] < arr[r] ? arr[l] : arr[r];
    for (int i = l + 1; i < r; i++) {
        count += (tmp - arr[i] > 0 ? tmp - arr[i] : 0);
    }
}
int getMaxInArr(int* arr, int l, int r) {
    int max = l + 1;
    if (r - l == 1) {
        return arr[r] > arr[l] ? arr[r] : arr[l];
    }
    for (int i = l + 1; i < r; i++) {
        if (arr[i] > arr[max]) {
            max = i;
        }
    }
    return max;
}
bool isRainArea(int* arr, int l, int r) {
    int tmp = 0;
    if (arr[l] == 1 && arr[r] == 1) {
        return true;
    }
    int minSide = (arr[l] < arr[r] ? arr[l] : arr[r]);
    for (int i = l + 1; i < r; i++) {
        tmp = arr[i];
        if (tmp >= minSide) {
            return false;
        }
    }
    return true;
}
void countrAea(int* arr, int l, int r) {
    if (l == r) {
        return;
    }
    if (isRainArea(arr, l, r)) {
        countRain(arr, l, r);
    } else {
        int max = getMaxInArr(arr, l, r);
        countrAea(arr, l, max);
        countrAea(arr, max, r);
    }
}
long long maxWater(int* arr, int arrLen ) {
    countrAea(arr, 0, arrLen - 1);
    return count;

}

全部评论

相关推荐

点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务