题目:
小Q在周末的时候和他的小伙伴来到大城市逛街,一条步行街上有很多高楼,共有n座高楼排成一行。
小Q从第一栋一直走到了最后一栋,小Q从来都没有见到这么多的楼,所以他想知道他在每栋楼的位置处能看到多少栋楼呢?(当前面的楼的高度大于等于后面的楼时,后面的楼将被挡住)
示例1
输入
[5,3,8,3,2,5]
输出
[3,3,5,4,4,4]
说明

当小Q处于位置3时,他可以向前看到位置2,1处的楼,向后看到位置4,6处的楼,加上第3栋楼,共可看到5栋楼。当小Q处于位置4时,他可以向前看到位置3处的楼,向后看到位置5,6处的楼,加上第4栋楼,共可看到4栋楼。

备注:
输入为一个数组,表示每一栋楼的高度w[i]
1<=数组长度<=100000;
1<=wi<=100000;

思路:
最直接也就是暴力遍历的方式就是直接在每一个位置都遍历整个数组。当然这必然会超出时间限制。那么要优化就要找到冗余成分。这道题的冗余成分就在于每一个元素的单个方向看过去,能够看到的楼必然曾递增趋势。那么在遍历过程保存递增楼层而消去中间段冗余的楼层就是需要做的优化步骤。不然在每一步遍历时,都会遍历判断是否可取。
这道题借鉴了某些大佬的想法。使用单调栈来解。
分两步,分别计算从右往左看和从左往右看的情况。
1.
从右往左看,那么保留递减趋势的楼层,也就是说,一开始,栈空,当我们遍历第一个楼层,第二个楼层向左看必然能看到,故而第一个楼层压入栈,此时第二个楼层往左看能看到的数量就是栈的大小,即1。遍历第二个楼层时,若第二个楼层比第一个楼层高,那么从第三个楼层开始,所有楼层都看不到第一个楼层了,那么就需要先弹出栈元素,再压入第二个楼层,若第二个楼层比第一个楼层低,那么这种递减趋势,第三个楼层往左看时都可以看到,也就是说,直接把第二个楼层压入栈,那么此时第三个楼层往左能看到的数量就是栈的大小,即2。依次类推,当遍历到第i个楼层时,若第i个楼层比栈顶元素的楼层高,那么就需要依次弹出比第i个楼层低或相等的楼层,然后在压入第i个楼层。此时第i+1个楼层往左看的数量也就确定了。

2.
从左往右看,与1同理,只要从数组后面往前遍历即可。

代码:

class Solution {public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param heights int整型vector * @return int整型vector*/vector<int> findBuilding(vector<int>& heights) {// write code hereint length = heights.size();vector<int> nums(length);stack<int> h;stack<int> r;for (int i = 0; i < length; i++){nums[i] = 1;}for (int i = 0; i < length-1; i++){while (!h.empty() && heights[i] >= h.top()){h.pop();}h.push(heights[i]);nums[i + 1] += h.size();}for (int i = length - 1; i > 0; i--){while (!r.empty() && heights[i] >= r.top()){r.pop();}r.push(heights[i]);nums[i - 1] += r.size();}return nums;}
};

C++编程-牛客网-逛街相关推荐

  1. python牛客网编程题_一波优秀的自学编程语言网站

    网课已经开设两三个月了 同学们上网课的效果怎么样呢? 特别是学编程的同学 没有了学校的学习氛围 没有了老师面对面教学指导 你是否为了编程而焦头烂额,生无可恋呢? 没事,现在同学们的福利来啦! 下面是给 ...

  2. 牛客网在线编程----算法入门篇

    标题本篇博文主要是记录下自己的在线编程情况,初次练习,有的算法还待改进,大家有需要可以去牛客网上面多练练! 有需戳–>牛客网在线编程 NC65.题目描述 大家都知道斐波那契数列,现在要求输入一个 ...

  3. DayDayUp之Job:牛客网—算法工程师—剑指offer之66道在线编程(解决思路及其代码)——1~20

    DayDayUp之Job:牛客网-算法工程师-剑指offer之66道在线编程(解决思路及其代码)--01~20 目录 剑指offer--66道在线编程--01~20 1.二维数组中的查找某个targe ...

  4. DayDayUp之Job:牛客网—算法工程师—剑指offer之66道在线编程(解决思路及其代码)——41~66

    DayDayUp之Job:牛客网-算法工程师-剑指offer之66道在线编程(解决思路及其代码)--41~66 目录 剑指offer之66道在线编程--41~66 42.和为s的两个数字 43.左旋转 ...

  5. DayDayUp之Job:牛客网—算法工程师—剑指offer之66道在线编程(解决思路及其代码)——21~40

    DayDayUp之Job:牛客网-算法工程师-剑指offer之66道在线编程(解决思路及其代码)--21~41 目录 剑指offer之66道在线编程--21~41 21.栈的压入.弹出序列 22.从上 ...

  6. 牛客网剑指offer编程实践1-10题

    牛客网剑指offer编程实践1-10题 1.二维数组中的查找 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这 ...

  7. 牛客网--蘑菇街2016研发工程师编程题

    牛客网--蘑菇街2016研发工程师编程题 第一题: 搬圆桌 时间限制:1秒 空间限制:32768K 现在有一张半径为r的圆桌,其中心位于(x,y),现在他想把圆桌的中心移到(x1,y1).每次移动一步 ...

  8. JavaScript_牛客网_编程初学者入门训练(21-30题解)

    牛客网编程初学者入门训练题解JavaScript版本 编程初学者入门训练第21-30题解答(js) 22.你能活多少秒 25.计算体重指数 26.计算三角形的周长和面积 27.计算球体体积 28.大小 ...

  9. 牛客网最全在线笔试、编程攻略(建议收藏)

    来源:牛客网 整理:大数据肌肉猿 一.常见问题 设备问题 问: 浏览器使用问题? 答:浏览器推荐使用最新版本的Chrome或者火狐浏览器,如果某一浏览器出现问题可以换个浏览器重新打开页面. 问: 摄像 ...

最新文章

  1. Java 8里的Predicate学习笔记
  2. 使用Spring Boot和H2可以完全工作的原型
  3. android调用fragment的方法,AndroidX下使用Activity和Fragment的变化
  4. iPhone 5的发布日期估计为9月21日挂
  5. CentOS 7下配置IP地址
  6. 怎样用比较器实现信号的衰减和饱和_小器件大功用之变频器输入滤波器
  7. Solidity教程序列1 - 类型介绍
  8. Python爬虫入门【11】:半次元COS图爬取
  9. “某某云词典” – 纠结的初体验
  10. 2012第27周移动APP推荐
  11. OpenCV开发笔记(四十一):红胖子8分钟带你深入了解scharr滤波器算子边缘检测(图文并茂+浅显易懂+程序源码)
  12. 计算机基础和photoshop的应用,一级计算机基础与Photoshop应用真题
  13. Empire简介及安装
  14. NLP入门_自然语言处理_AI分支
  15. 【转】Linux那些事儿之我是Hub(7)蝴蝶效应
  16. C语言数据结构课程设计任务书
  17. NBTSCAN的使用,查找arp病毒工具。
  18. 切换效果:coverflow 封面轮播图
  19. 服务器架构-架构图(二)
  20. 陈天奇的机器学习编译课(免费)

热门文章

  1. 搜狗搜微信链接为什么老是失效?
  2. 基于 HTML5 WebGL 的高炉炼铁厂可视化系统
  3. Swift_代码混淆
  4. 学生管理系统详细架构
  5. Elasticsearch 压测方案之 es rally 简介
  6. 解决openssl提示链接库不存在的问题
  7. 简历制作(项目经验)
  8. 十进制整数,转换成八进制和十六进制数并输出。
  9. Ordinal numeral
  10. python交换机ssh巡检_paramiko交换机巡检