题解 | #逛街#
逛街
http://www.nowcoder.com/practice/58ae39f4436b44d9836fc89542d67f71
- 从左到右,从右向左,依次设置两个栈。推荐分开进行理解,就比较容易解决此类问题。最后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;
}
}; 大厂笔试题题解 文章被收录于专栏
主要是公司笔试题得一些总结
字节跳动公司福利 1297人发布
查看13道真题和解析