首页 > 代码库 > leetcode之Container With Most Water 和Trapping Rain Water

leetcode之Container With Most Water 和Trapping Rain Water

Container With Most Water

 

Given n non-negative integers a1a2, ..., an, where each represents a point at coordinate (iai). n vertical lines are drawn such that the two endpoints of line i is at (iai) 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;
    }
};

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!

思路见这里,作者讲解的很详细

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;
    }
};

另外还有两个相似的题目,都是和直方图相关的,具体看这里



leetcode之Container With Most Water 和Trapping Rain Water