Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.
Note: You may not slant the container.
分析参考这里,作者讲解的很详细
class Solution { public: int maxArea(vector<int> &height) { int left = 0,right = height.size()-1,area = 0; while(left < right) { area = max(area,min(height[left],height[right])*(right-left));//当前位置的面积 if(height[left] < height[right]) { int k = left; while(k < right && height[k] <= height[left])++k;//找下一个位置 left = k; } else { int k = right; while(k > left && height[k] <= height[right])--k;//找下一个位置 right = k; } } return area; } };
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!
思路见这里,作者讲解的很详细
class Solution { public: int trap(int A[], int n) { vector<int> leftMostHeight(n,0),rightMostHeight(n,0); int mostHeiht = 0,i,area = 0; for(i = 0;i < n;++i) { leftMostHeight[i] = mostHeiht;//左边的最大高度 mostHeiht = max(mostHeiht,A[i]); } mostHeiht = 0; for(i = n-1;i >= 0;--i) { rightMostHeight[i] = mostHeiht;//右边的最大高度 mostHeiht = max(mostHeiht,A[i]); } for(i = 0;i < n;++i) { int a = min(leftMostHeight[i],rightMostHeight[i]) - A[i];//当前高度的蓄水量 if(a > 0)area += a; } return area; } };