接雨水
题目描述:
给定 n
个非负整数表示每个宽度为 1
的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
例:
【分析】
采用双指针:ow和high。
两头挤,谁小谁往中间走,最终一定能够走到最大值处,所以,只需要找到左右两边的最大值(一定比整体的最大值小于或者等于)。两边收集的雨水,为 sum = sum + maxleft - height[low];
和 sum = sum + maxright - height[high];
因为有整体最大值兜底,所以这样减十分的安全,不会溢出。并且左右两边最大值的位置,一定在left
和high
之后。
【代码】(c语言)
int trap(int* height, int heightSize) {
int low = 0,high = heightSize - 1;
int maxleft = 0,maxright = 0;
int sum = 0;
while (low < high){
//更新左边最大值
if (height[low] > maxleft){
maxleft = height[low];
}
//更新右边最大值
if (height[high] > maxright){
maxright = height[high];
}
//左右两边谁小,谁往中间挤
if (height[low] < height [high]){
sum = sum + maxleft - height[low];
low ++;
}
else {
sum = sum + maxright - height[high];
high --;
}
}
return sum;
}
}
}
return sum;
}