一:题目
二:思路
1.读题读不懂,那就分析给出的示例,本题意思就是给出一串数,然后找出找出该元素之后,第一个大于
该元素的下标(这一串数的下标是从一开始的)如果找不到比起大的,那就记为0
2.这里我们是选择的是利用栈,我们从右边开始把数组的元素下标压入栈中,然后在判断当前元素
与栈顶元素的大小关系,如果比其大那么就pop 跟新栈顶元素,直到我们找到栈顶元素大于该元素
记录该下标。
三:上码
/**思路:1.读题读不懂,那就分析给出的示例,本题意思就是给出一串数,然后找出找出该元素之后,第一个大于该元素的下标(这一串数的下标是从一开始的)如果找不到比起大的,那就记为0 2.这里我们是选择的是利用栈,我们从右边开始把数组的元素下标压入栈中,然后在判断当前元素与栈顶元素的大小关系,如果比其大那么就pop 跟新栈顶元素,直到我们找到栈顶元素大于该元素记录该下标。 51 4 2 3 52 5 4 5 0*/
#include<iostream>
#include<stack>
#include<vector>
using namespace std;int main(){int a[100000];//注意数组范围得需要开的足够大int ans[100000];stack<int> s;int N; scanf("%d",&N);for(int i = 1; i <= N; i++){//cin >> a[i];scanf("%d",&a[i]);}for(int i = N; i >= 1; i--){//这里我们选择的入栈顺序是从数组的尾部开始 while(!s.empty() && a[s.top()] <= a[i]){//这个就是为了找到一个大于a[i]的元素下标,也就是s.top()。 s.pop();}ans[i] = s.empty() ? 0 : s.top();//如果s是空栈的话,那么就为0,否则就为栈的顶部元素s.push(i); } cout << ans[1];for(int i = 2; i <= N; i++){cout << ' ' << ans[i];}}