leetcode之Container With Most Water 和Trapping Rain Water

来源:互联网 发布:红色 知乎 编辑:程序博客网 时间:2024/06/15 21:07

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

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



5 2
原创粉丝点击