[leetcode]Trapping Rain Water
2017-04-09 15:54
387 查看
Trapping Rain Water
Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.
difficulty:hard
For example,
Given
The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. Thanks Marcos for contributing this image!
题目写的很清楚,图也很直观,就是计算这些树状图在下雨的时候能存多少雨水。
我用的方法是从左到右遍历每个数,找到每个坑并计算存水的数量。当数是降序的时候,说明是坑的左边,数是升序的时候就是坑的右边。遍历的时候如果遇到坑左就记录一下位置,如果遇到坑右就开始计算能存的水,并把已经计算过的坑填上,最后重新记录可以作为坑左的位置。
Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.
difficulty:hard
For example,
Given
[0,1,0,2,1,0,1,3,2,1,2,1], return
6.
The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. Thanks Marcos for contributing this image!
题目写的很清楚,图也很直观,就是计算这些树状图在下雨的时候能存多少雨水。
我用的方法是从左到右遍历每个数,找到每个坑并计算存水的数量。当数是降序的时候,说明是坑的左边,数是升序的时候就是坑的右边。遍历的时候如果遇到坑左就记录一下位置,如果遇到坑右就开始计算能存的水,并把已经计算过的坑填上,最后重新记录可以作为坑左的位置。
int trap(vector<int>& height) { vector<int> left; int result = 0; int i; for (i=0; i< height.size(); i++){//找到第一个不为0的数 if (height[i] > 0) break; } left.push_back(i);//记录不为0的位置 i++; for (; i < height.size(); i++){//开始遍历 if (height[i]>height[i - 1]){//升序情况 int max = left[left.size() - 1]; for (int j = left.size() - 1; j >= 0; j--){ if (i - j > 1){//坑左与坑右距离要大于1 if (height[left[j]] >= height[i]){//往前找到高度大于等于当前坑右的坑左 for (int k = left[j] + 1; k < i; k++){//记录坑并填坑 result += height[i] - height[k]; height[k] = height[i]; } left.push_back(i);//当前坑右往后当做坑左来计算 break; } } if (height[left[j]] > height[max])//记录坑右中最高的 max = left[j]; } if (height[max] < height[i]){//前面没找到比当前坑右高的坑左,则用坑左里最高的那个 if (i - max>1){//坑左与坑右距离要大于1 for (int k = max + 1; k < i; k++){//记录坑并填坑 result += height[max] - height[k]; height[k] = height[max]; } left.push_back(i);//当前坑右往后当做坑左来计算 } else{ left.push_back(i);//当前坑右往后当做坑左来计算 } } } else{//降序或者不变则记录为坑左 left.push_back(i); } } return result; }
相关文章推荐
- [leetcode]Trapping Rain Water
- leetcode-trapping rain water
- *LeetCode-Trapping Rain Water
- Leetcode -- Trapping Rain Water
- Leetcode 42 Trapping Rain Water
- 【Leetcode】Trapping Rain Water
- LeetCode | Trapping Rain Water
- [leetcode][two pointers] Trapping Rain Water
- [Leetcode] Trapping Rain Water
- [LeetCode]Container With Most Water、Trapping Rain Water
- LeetCode Trapping Rain Water
- LeetCode 111 Trapping Rain Water
- [leetcode]Trapping Rain Water
- 【题解】【直方图】【Leetcode】Trapping Rain Water
- LeetCode 42 - Trapping Rain Water
- LeetCode Online Judge 题目C# 练习 - Trapping Rain Water
- leetCode_Trapping Rain Water
- LeetCode-Trapping Rain Water
- 【leetcode】Trapping Rain Water
- Leetcode NO.42 Trapping Rain Water