class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums intvector 
     * @return intvector<vector<>>
     */
    /*
    理解去记忆
    while(栈空或者curr > top) {
        top的下一个最大值就是curr
        push到ret中
    }
    将curr push到stack中。
    return ret
    staMax, staMin.
    一个一个的算,先算staMax
    
    */
    vector<vector<int> > foundMonotoneStack(vector<int>& nums) {
        int len = nums.size();
        stack<int> staRight, staMin;
        vector<int> vecRight (len, -1);
        vector<int> vecLeft (len, -1);
        vector<vector<int>> ret (len, vector<int> (2, -1));
        
        for (int i = 0; i < len; i++) {
            while(!staRight.empty() && nums[i] < nums[staRight.top()]) {
//                 ret[staBig.top()][0] = i;
                vecRight[staRight.top()] = i;
                staRight.pop();
            }
            staRight.push(i);            
        }
        /*
            左面的第一个最小值的index 与 将数组翻转或,右面的第一个小值index的关系为
            index1 + index2 = len - 1;            
        */
        // step1 翻转数组
        reverse(nums.begin(), nums.end());
        // step2: 单调栈
        for (int i = 0; i < len; i++) {
            while(!staMin.empty() && nums[i] < nums[staMin.top()]) {
                vecLeft[staMin.top()] = i;
                staMin.pop();
            }
            staMin.push(i);            
        }
        // 再次翻转结果数组
        reverse(vecLeft.begin(), vecLeft.end());
        // 通过翻转后的数组的index得到之前数组的左面第一个最小值的index
        // 重新计算
        for (int i = 0; i < len; i++) {
            if(vecLeft[i] != -1) {
                vecLeft[i] = (len - 1 - vecLeft[i]);
            }
        }
     
        // 合并结果
        for(int i = 0; i  < len; i++) {
            ret[i][0] = vecLeft[i];
            ret[i][1] = vecRight[i];
            
        }
        return ret;
    }
};