您的位置:首页 > 移动开发

leetcode(42) - Trapping Rain Water

2016-11-29 15:28 489 查看
给定n个非负整数,代表一个柱状图,每一个柱子的宽度为1,计算下雨之后柱状图能装多少水?

例如:

[0,1,0,2,1,0,1,3,2,1,2,1]  返回 6

    


上述柱状图是由数组表示[0,1,0,2,1,0,1,3,2,1,2,1]。在这种情况下,6个单位的雨水(蓝色部分)被装。



对于每个柱子,找到其左右两边最高的柱子,该柱子能容纳的面积就是 min(leftMostHeight,rightMostHeight) - height。所以,

1. 从左往右扫描一遍,对于每个柱子,求取左边最大值;

2. 从右往左扫描一遍,对于每个柱子,求最大右值;

3. 再扫描一遍,把每个柱子的面积并累加。

int trap(int* height, int heightSize) {

if(heightSize <= 2) return 0;

int i = 0;
int* left_max=malloc(sizeof(int) * heightSize);
memset(left_max, 0, heightSize);
int* right_max=malloc(sizeof(int) * heightSize);
memset(right_max, 0, heightSize);

int left_tmp_max=0, right_tmp_max=0, ret=0;

while(i < heightSize){    // 针对每个元素i,寻找它左边最大的,保存在left_max[i]
left_max[i] = left_tmp_max;
if(left_tmp_max < height[i])
left_tmp_max=height[i];
i++;
}

i=heightSize-1;
while(i >= 0){             // 针对每个元素i, 寻找它右边最大的,保存在right_max[i]
right_max[i] = right_tmp_max;
if(right_tmp_max < height[i])
right_tmp_max=height[i];
i--;

}

i=0;
while(i<heightSize){        //处理每个元素i,将min(left_max[i], right_max[i])-height[i] 加到ret中,即每个元素上面可以存储的水
if(left_max[i] > right_max[i]) {
ret+= ((right_max[i]-height[i])>0 ? (right_max[i]-height[i]) : 0);
} else {
ret+= ((left_max[i]-height[i])>0 ? (left_max[i]-height[i]) : 0);
}
i++;

}

return ret;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: