• [LeetCode]Trapping Rain Water


    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.

    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!

    思路:找到最大值及其位置pos。然后从左往右遍历到pos,再从右往左遍历到pos。

    什么时候会加水呢?

    遍历的时候记录最大值,也就是全局第二大的值,如果当前值比第二大的小,那么就会加水了,小多少就加多少。

    加水是一列列加的。下图。

     1 class Solution {
     2 public:
     3     int trap(vector<int>& height) {
     4         if(height.size()<=2) return 0;
     5         int result=0;
     6         int pos=0,maxHeight=0;
     7         for(int i=0;i<height.size();i++)
     8         {
     9             if(height[i]>maxHeight)
    10             {
    11                 maxHeight = height[i];
    12                 pos = i;
    13             }
    14         }
    15         int cur_max = height[0];
    16         for(int i=1;i<pos;i++)
    17         {
    18             cur_max = max(cur_max,height[i]);
    19             result+=(cur_max-height[i]);
    20         }
    21         cur_max = height[height.size()-1];
    22         for(int i=height.size()-2;i>pos;i--)
    23         {
    24             cur_max = max(cur_max,height[i]);
    25             result+=(cur_max-height[i]);
    26         }
    27         return result;
    28     }
    29 };

    其实不需要找到最大值也可以。按照寻找最大值的思路。移动第二大的值。思路和上面一样。代码简洁些。

     1 class Solution {
     2 public:
     3     int trap(vector<int>& height) {
     4         if(height.size()<=2) return 0;
     5         int result=0;
     6         int left=0,right=height.size()-1,secHeight=0;
     7         while(left<right)
     8         {
     9             if(height[left]<height[right])
    10             {
    11                 secHeight = max(height[left],secHeight);
    12                 result+=(secHeight-height[left]);
    13                 left++;
    14             }
    15             else
    16             {
    17                 secHeight = max(height[right],secHeight);
    18                 result+=(secHeight-height[right]);
    19                 right--;
    20             }
    21         }
    22         return result;
    23     }
    24 };
  • 相关阅读:
    (模板)高斯消元法模板
    poj1797(dijstra变形,求最小边的最大值)
    poj2253(floyd变形)
    (模板)poj2387(dijkstra+优先队列优化模板题)
    poj1915(双向bfs)
    poj3977(折半枚举+二分查找)
    uva11624 Fire! (bfs预处理)
    codeforces#1152C. Neko does Maths(最小公倍数)
    codeforces#1154F. Shovels Shop (dp)
    codeforces#1136E. Nastya Hasn't Written a Legend(二分+线段树)
  • 原文地址:https://www.cnblogs.com/Sean-le/p/4805186.html
Copyright © 2020-2023  润新知