接雨水
题目描述:
给定 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;
}
893

被折叠的 条评论
为什么被折叠?



