腾讯2020校园招聘-后台 第二题

题目:

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

输入例子1:
[5,3,8,3,2,5]

输出例子1:
[3,3,5,4,4,4]

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

 

代码:

//暴力法超时,未通过

复制代码
 1 /**
 2  * @author zcy
 3  * @date 2021年04月08日 12:46
 4  */
 5 public class Solution {
 6 
 7     public int[] findBuilding (int[] heights) {
 8         // write code here
 9         int left=0, right=0;
10         int count=0;
11         int[] res=new int[heights.length];
12         for (int i = 0; i < heights.length; i++) {
13             //i为当前统计位置,count为统计值,再最后要加上自己(能看到自己)
14             left=i-1;
15             right=i+1;
16             count=0;
17             //统计前方(左侧)可看
18             int hight=0;    //遍历后方时,得到的当前最高的房屋高度,比此低和同高,看不到
19             while(left>=0){
20                 if(hight<heights[left]){
21                     count++;
22                     hight=heights[left];
23                 }
24                 left--;
25             }
26             hight=0;
27 
28             //统计后方(右侧)可看
29             while(right<heights.length){
30                 if(hight<heights[right]){
31                     count++;
32                     hight=heights[right];
33                 }
34                 right++;
35             }
36             res[i]=++count;
37         }
38         return res;
39     }
40 }
复制代码

 

代码:

复制代码
 1 package com.zcy.mybatisplus.tx;/**
 2  * @author chenyang zhang
 3  * @date 2021/4/8 - 12:46
 4  */
 5 
 6 import java.util.Arrays;
 7 import java.util.Stack;
 8 
 9 /**
10  * @author zcy
11  * @date 2021年04月08日 12:46
12  */
13 //采用单调递减栈,栈顶元素最小,因为前面房屋矮,不会挡住后面;
14 // 前面高,才会挡住后面,栈顶是最接近当前位置房屋,所以要最小,
15 // 代表此时栈顶所在位置向某一方向能看到房屋。
16 public class Solution {
17 
18     public int[] findBuilding (int[] heights) {
19         // write code here
20         Stack<Integer> stack=new Stack<>();
21         int len=heights.length;
22         int[] res=new int[len];
23         //至少可以看到自己
24         Arrays.fill(res,1);
25         //从后往前看,如果当前位置比栈顶小,那么可以看到
26         for (int i = len-1; i >=0 ; i--) {
27             res[i]+=stack.size();
28             //此时是为了保证单调递减,求的下一位置可看到的房屋数量
29             while(!stack.isEmpty()&&stack.peek()<=heights[i]){
30                 stack.pop();
31             }
32             stack.push(heights[i]);
33         }
34         //将栈恢复到空栈,计算下一个方向
35         stack.clear();
36 
37         //从前往后看,如果当前位置比栈顶小,那么站在其后面一个位置可以看到当前房屋
38         //反之当前房屋比栈顶高,站在后面一个位置就看不到此时的栈顶这个房屋,所以要退栈
39         for (int i = 0; i <=len-1 ; i++) {
40             res[i]+=stack.size(); //记录当前房屋朝后看额能看到的数量
41             while(!stack.isEmpty()&&stack.peek()<=heights[i]){
42                 stack.pop();
43             }
44             stack.push(heights[i]);
45         }
46         return res;
47     }
48 
49     public static void main(String[] args) {
50         int[] arr= {5, 3, 8, 3, 2, 5};
51         Solution solution=new Solution();
52         int[] res=solution.findBuilding(arr);
53     }
54 }
复制代码

 

posted @   堤苏白  阅读(181)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示