题目描述
数据结构实验之栈与队列六:下一较大值(二)
Time Limit: 150 ms Memory Limit: 8000 KiB
Submit Statistic Discuss
Problem Description
对于包含n(1<=n<=100000)个整数的序列,对于序列中的每一元素,在序列中查找其位置之后第一个大于它的值,如果找到,输出所找到的值,否则,输出-1。
Input
输入有多组,第一行输入t(1<=t<=10),表示输入的组数;
以后是 t 组输入:每组先输入n,表示本组序列的元素个数,之后依次输入本组的n个元素。
Output
输出有多组,每组之间输出一个空行(最后一组之后没有);
每组输出按照本序列元素的顺序,依次逐行输出当前元素及其查找结果,两者之间以–>间隔。
Sample Input
2
4 12 20 15 18
5 20 15 25 30 6
Sample Output
12–>20
20–>-1
15–>18
18–>-1
20–>25
15–>25
25–>30
30–>-1
6–>-1
代码 & 分析
很容易想到最直接的方法,当时题目中注明了数据量很大,因此借助栈来实现,主要思想就是第一个数字直接入栈,其他的数字先对栈顶的数字进行比较,如果大于栈顶元素的值的话,说明栈顶元素的下一最大值已经找到,记录下来,然后出栈就可以了,也就是说,对于每个输入的数字,是从它前一个数字开始向前比较的,因此得到的就是离之前的数字的最近的最大值:
#include<stdio.h>
#include<stdlib.h>
#include<stack>
#include<iostream>
using namespace std;
struct node{ //用来记录每个数字的值以及下一最大值,为了方便取值 定义了id
int id;
int a;
int next;
};
node s[1000000];
int main(){
int n;
cin>>n;
while(n--){
int m;
stack<node> st;
cin>>m;
for(int i=0; i<m; i++){
cin>>s[i].a;
s[i].id = i;
s[i].next = -1; //对每个数初始化
if(st.empty()){ //如果栈空,那么这个数字之前没有数字也就不用找离它最近的小于它的数字了
st.push(s[i]);
}
else{
while(!st.empty()){ //循环寻找 因为一个数字可能是多个数字的最近较大值
if(s[i].a > st.top().a){
s[st.top().id].next = s[i].a;
st.pop();
}
else{
break;
}
}
st.push(s[i]);
}
}
for(int i=0; i<m; i++){
cout<<s[i].a<<"-->"<<s[i].next<<endl;
}
cout<<endl;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/116790.html