Day8 栈的使用--计算面积 接雨水
Posted 未来可期-2018
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day8 栈的使用--计算面积 接雨水相关的知识,希望对你有一定的参考价值。
题目
→
\\rightarrow
→计算面积
输入为 “\\///_//\\\\//\\///__\\_\\//_/”
输出总的积水面积和各积水处面积
思路
首先计算总面积
- 如果是\\,将坐标 i i i压入栈S1
- 如果是/,取出S1中最近配对的/,算出两者距离 i − i p i-i_p i−ip并累加到总面积中
- 如果是_,不做处理
然后计算各个积水处面积
另建栈S2保存各积水处面积,栈S2中每个数据为最左边/的坐标和其对应的积水面积,如果新计算\\对应的坐标小于S2栈顶的坐标,那么说明计算的\\可以和S2中积水合并。
//计算面积
#include<bits/stdc++.h>
using namespace std;
int main()
//记录最左边\\
stack<int> S1;
//记录\\及其对应的面积
stack<pair<int,int> >S2;
string s3;
cin>>s3;
char ch;
//总面积
int sum=0;
for(int i=0;i<s3.size();++i)
ch=s3[i];
if(ch=='\\\\')
S1.push(i);
else if(ch=='/'&&!S1.empty())
int j=S1.top();
S1.pop();
//配对的一对\\/面积为i-j
sum+=i-j;
//合并洼地
int a=i-j;
//如果S2中\\坐标小于新的\\,那么合并两个洼地
while(!S2.empty()&&S2.top().first>j)
a+=S2.top().second;
S2.pop();
S2.push(make_pair(j,a));
//ch为-时什么也不做
cout<<sum<<endl;
cout<<S2.size();
vector<int>ans;
while(!S2.empty())
ans.push_back(S2.top().second);
S2.pop();
for(int i=ans.size()-1;i>=0;--i)
cout<<" "<<ans[i];
cout<<endl;
return 0;
题目
→
\\rightarrow
→接雨水
和上一题类似
- 设栈S存储pair<int,int> 高度和坐标
- 如果当前高度小于栈顶S高度,那么计算面积,入栈
- 如果当前高度大于等于栈顶S高度,依次出栈,计算面积,直到栈空或者有一个大于当前高度,最后入栈。需要注意在该过程中计算面积比较复杂。
class Solution
public:
int trap(vector<int>& height)
int sum=0;
//高度和坐标
stack<pair<int,int> >S;
for(int i=0;i<height.size();++i)
if(height[i]!=0)
if(S.empty())
S.push(make_pair(height[i],i));
else
if(height[i]>=S.top().first)
sum+=(i-S.top().second-1)*S.top().first;
pair<int,int> last=S.top();
S.pop();
while(!S.empty()&&height[i]>=S.top().first)
sum+=(i-S.top().second-1)*(S.top().first-last.first);
last=S.top();
S.pop();
if(!S.empty())
sum+=(i-S.top().second-1)*(height[i]-last.first);
else
sum+=(i-S.top().second-1)*height[i];
S.push(make_pair(height[i],i));
return sum;
;
以上是关于Day8 栈的使用--计算面积 接雨水的主要内容,如果未能解决你的问题,请参考以下文章