方法一:
采用竖向累加得面积
从两端往中间逼近,记录左右两端高度最高值,那么对于这两端最高值中间部分,如果高度低于两端最高值,能接的雨水取决于两端最高值中的最小值。
class Solution {
public:
int trap(vector<int>& height) {
int left=0,right=height.size()-1,Left=0,Right=0,area=0;
while(left<right)
{
if(height[left]<height[right])
{
if(height[left]>=Left)
Left=height[left];
else
area+=Left-height[left];
left++;
}
else
{
if(height[right]>Right)
Right=height[right];
else
area+=Right-height[right];
right--;
}
}
return area;
}
};
方法二:
利用栈
对面积采用横向累加求解
class Solution {
public:
int trap(vector<int>& height) {
stack<pair<int,int>>st;
int are=0,i=0;
for(;i<height.size();i++)
{
if(st.empty())
st.push(make_pair(height[i],i));
else if(height[i]<st.top().first)
st.push(make_pair(height[i],i));
else
{
while(!st.empty()&&height[i]>=st.top().first)
{
auto tmp=st.top();
st.pop();
if(!st.empty())//注意这里要检查一下是否为空
are+=(i-1-st.top().second)*(min(height[i],st.top().first)-tmp.first);//采用横向累加面积
}
st.push(make_pair(height[i],i));
}
}
return are;
}
};
1250

被折叠的 条评论
为什么被折叠?



