1. 程式人生 > 實用技巧 >7.15每日一題題解

7.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;
}