1. 程式人生 > 其它 >Expected one result (or null) to be returned by selectOne(), but found: 7

Expected one result (or null) to be returned by selectOne(), but found: 7

距離最近的較小值

/**
 * 暴力
 */
#include <iostream>

using namespace std;

const int N = 100010;

int n, a[N];

int main()
{
    cin >> n;
    for (int i = 0; i < n; ++ i)
    {
        cin >> a[i];
        bool find = false;
        for (int j = i - 1; j >= 0; -- j)
            if (a[j] < a[i]) 
            {
                cout << a[j] << ' ';
                find = true;
                break;
            }
        if (!find) cout << -1 << ' ';
    }
}

/**
 * 正解
 * 暴力的問題是不管三七二十一j一定會全遍歷一遍
 * 對於這種情況 1 10 10 10 10 10 10 ...後面全是10
 * 前面的10對於後面的10明顯都是非法答案,但j還是要掃一遍,肯定會超時
 * 這種情況可以抽象為對於i < j,a[i] >= a[j], 這樣的a[i]顯然不可能是a[j + 1], a[j + 2]... 的答案,因為更靠近它們的有a[j]
 * 所以我們完全可以不用考慮這樣的a[i],也就是把a[j]之前比它大的數全都去掉對後面的結果是不產生影響的
 * 下面這種做法之所以叫做單調棧是因為棧中儲存的始終是一個單調的序列,因為過程中把所有的逆序對全都刪除了
 */
#include <iostream>

using namespace std;

const int N = 100010;

int n, a[N];
int stk[N], tt;

int main()
{
    cin >> n;
    for (int i = 0; i < n; ++ i) 
    {
        cin >> a[i];
        while (tt > 0 && stk[tt] >= a[i]) -- tt;
        if (tt > 0) cout << stk[tt] << ' ';
        else cout << -1 << ' ';
        stk[++ tt] = a[i];
    }
    return 0;
}