How Many Buildings
这个题目需要维护一个递增的栈就行了,通过分析发现因为要求求最少的楼栋数,只要是一个区间内最低的楼总是可以看成一栋楼。这样的话建立一个栈,维护使其递增就行了。具体操作如下
元素依次入栈,栈空时元素直接入栈(当然楼高为0的话就不用入栈了)其余每次都进行与栈顶的比较,小于栈顶 栈顶元素出栈(对应于实际中被夹在两栋低楼之间较高的楼,独立成楼),res+1,直到与栈顶元素相等(此时待插入元素舍弃,对应于实际的一栋楼)或者到栈空(待插入元素入栈) 依次操作,直到结束。
然后,将res+s.top 得到总共最少的楼
代码如下:
时间复杂度:这一题运用了一个栈来实现,每个元素都是入栈一次,当然是O(n)
空间复杂度 O(2n)的 栈和队列
这个题目需要维护一个递增的栈就行了,通过分析发现因为要求求最少的楼栋数,只要是一个区间内最低的楼总是可以看成一栋楼。这样的话建立一个栈,维护使其递增就行了。具体操作如下
元素依次入栈,栈空时元素直接入栈(当然楼高为0的话就不用入栈了)其余每次都进行与栈顶的比较,小于栈顶 栈顶元素出栈(对应于实际中被夹在两栋低楼之间较高的楼,独立成楼),res+1,直到与栈顶元素相等(此时待插入元素舍弃,对应于实际的一栋楼)或者到栈空(待插入元素入栈) 依次操作,直到结束。
然后,将res+s.top 得到总共最少的楼
代码如下:
时间复杂度:这一题运用了一个栈来实现,每个元素都是入栈一次,当然是O(n)
空间复杂度 O(2n)的 栈和队列
#include<cstdio>
#include<cstring>
#define MAXSIZE 100005;
struct SequenStack{
int data[100005];
int top;
};
SequenStack s;
int n,i,m,result;
SequenStack Init_SequenStack()
{
s.top = 0;
return s;
}
/*
void Push_SequenStack(SequenStack s,int x) // 这两个函数可以在main函数里简单实现
{
s.top++;
s.data[s.top]=x;
}
void Pop_SequenStack(SequenStack s)
{
s.top--;
}
*/
int main()
{
int time = 0;
while(scanf("%d",&n)==1)
{
result = 0;
Init_SequenStack();
for(i=0;i<n;i++)
{
scanf("%d",&m);
while(s.top!=0&&s.data[s.top]>m)
{
result++;
s.top--;
}
while((s.top!=0&&s.data[s.top]<m)||
(s.top==0&&m>0))
{
s.top++;
s.data[s.top]= m;
}
}
result +=s.top;
time++;
printf("Case %d: %d\n",time,result);
}
return 0;
}