今天写了一道单调栈的题目p5788。
我首先说 一下我的思路(我这题没有通过,只有60分)题目是求出第i个数之后,比i大的值的下标。我是直接用一个二重循环,直接得出结果下标。然后时间就超限了,只有60分。这是我写得代码,虽然可以得出答案,但不能够通过。
#include<iostream>
using namespace std;
int main(void){
int n;
cin>>n;
int a[n+1];
int f[n+1];
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
int t=0;
for(int j=i+1;j<=n;j++){
if(a[i]<a[j]){
t=1;
f[i]=j;
break;
}
}
if(t==0)
f[i]=0;
}
for(int i=1;i<=n;i++){
cout<<f[i]<<" ";
}
return 0;
}
然后,我看了一下题解,这是一道关于单调栈得题目,
题目要求求每个数后面第一个比他大的数
我们可以构造一个单调递减的单调栈
当一个数被弹出,将要进栈的数就是f(f(要弹出的数))
如果一直没被弹出,f值就为0。改进后得代码如下
#include <iostream>
#define x 3000005
using namespace std;
int n,a[x],q[x],m,f[x];
int main() {
cout<<n;
for (int i=1; i<=n; i++) cout<<a[i];
for (int i=n; i>=1; i--) {
while (a[i]>=a[q[m]] && m>0) m--;
f[i]=q[m];
q[++m]=i;
}
for (int i=1; i<=n; i++) cout<<f[i]<<" ";
//最后正着输出。
return 0;
}
没有二重循环,时间不会超限。
学了Java,mysql的知识,学了Java的hash集合,map集合,set集合等等,知道了子类,夫类,抽象类,实现类。他们之间的继承,实现关系。熟悉了navicat的使用。