1. 从左到右,从右向左,依次设置两个栈。推荐分开进行理解,就比较容易解决此类问题。最后b直接reverse就可以得到从同一个脚标就行计算得目的。
  2. 牢牢比较堆得顶。并且这个思想是错位思想,ab记得是上一步的结果。下面得操作是为了下一步记录正确,而使用。都是当前元素比堆顶大,然后弹栈。最后加入新的自己。
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param heights int整型vector 
     * @return int整型vector
     */
    vector<int> findBuilding(vector<int>& heights) {
        // write code here
        vector<int> left,right;
        stack<int> left_s, right_s;

        //一次性从左到右,然后从右到左进行遍历
        for(int i =0, j = heights.size()-1; i<heights.size(), j>=0;i++,j--){
            //这个是由上一步决定的
            left.push_back(left_s.size());
            right.push_back(right_s.size());

            while(!left_s.empty()&& left_s.top()<= heights[i]) left_s.pop();//维护下一个位置的栈大小(只和栈顶比)
            while(!right_s.empty()&& right_s.top()<= heights[j]) right_s.pop();//维护下一个位置的栈大小(只和栈顶比)
            left_s.push(heights[i]);
            right_s.push(heights[j]);
        }
        vector<int> res;
        //最后right 需要reverse一下
        reverse(right.begin(),right.end());
        for(int i =0;i<heights.size();i++){
            res.push_back(left[i]+right[i]+1);
        }
        return res;   
    }
};