7.15每日一題題解
阿新 • • 發佈:2020-07-15
數列下標
涉及知識點:
- 單調棧
solution:
- 該題題意就是求每個數的右邊第一個比他的數的下標
- 如果不存在則為0,否則就輸出該點的下標
- 這個題資料範圍比較小,可以用暴力解決,但是這裡有一種更好的做法
- 通過單調棧來解決此類問題,可以大大的減少我們的時間
- 從 n - 1 到 1開始,對於當前的數,如果此時棧頂的元素比這個數還大的,那麼此時的答案就是棧頂的元素的下標
- 然後把這個數入棧,如果沒找到那麼答案就是0,也把這個數放入棧裡面
- 這樣能保證我們的時間複雜度為線性的
std:
#include <iostream> #include <queue> #include <stack> using namespace std; int n; const int N = 1e4 + 10; int a[N]; int b[N]; int main() { cin >> n; for(int i = 1;i <= n;i ++)cin >> a[i]; b[n] = 0; stack<int>stk; stk.push(n); for(int i = n - 1;i >= 1;i --) { int t = 0; while(stk.size()) { t = stk.top(); if(a[i] < a[t]) { break; } else { stk.pop(); } } if(stk.size()) { b[i] = t; } else { b[i] = 0; } stk.push(i); } for(int i = 1;i<= n;i ++) { cout << b[i] << ' '; } return 0; }