码迷,mamicode.com
首页 > 移动开发 > 详细

leetcode之Container With Most Water 和Trapping Rain Water

时间:2014-08-22 16:17:59      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:container   trapping rain water   leetcode   贪心   

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.

bubuko.com,布布扣

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

标签:container   trapping rain water   leetcode   贪心   

原文地址:http://blog.csdn.net/fangjian1204/article/details/38757705

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!