题解 | #接雨水问题#
接雨水问题
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;
}


