1 条题解
-
0
这是一道很典型的栈问题,
#include<bits/stdc++.h> using namespace std; int n, h[100010], ans[100010]; stack<int>st; int main() { cin >> n; for (int i = 1; i <= n; i++) cin >> h[i]; for (int i = n; i >= 1; i--) { while (!st.empty() && h[st.top()] <= h[i])st.pop(); if (st.empty())ans[i] = 0; else ans[i] = st.top(); st.push(i); } for (int i = 1; i <= n; i++) { cout << ans[i] << endl; } return 0; }
核心就是反向遍历,先判断栈里面是否有大于自己的元素,如果栈顶元素小于自己,则删除(因为第i个已经比后面栈顶的大,所以要是挡住i前面的·视野也肯定是第i个先挡住),然后后面判断栈是否为空,空就代表没有大于第i个学生的身高,就给ans[i]=0,如果不为空,就给ans[i]=st.top()(这是弹出栈顶元素,就是第一个大于h[i]的数)。
- 1
信息
- ID
- 122
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- 递交数
- 71
- 已通过
- 25
- 上传者