- 从左到右,从右向左,依次设置两个栈。推荐分开进行理解,就比较容易解决此类问题。最后b直接reverse就可以得到从同一个脚标就行计算得目的。
- 牢牢比较堆得顶。并且这个思想是错位思想,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; } };