逛街【 腾讯2020校园招聘-后台&综合-第一次笔试】(单调栈的应用)

简介: 逛街【 腾讯2020校园招聘-后台&综合-第一次笔试】(单调栈的应用)

题目描述:

 

小Q在周末的时候和他的小伙伴来到大城市逛街,一条步行街上有很多高楼,共有n座高楼排成一行。

小Q从第一栋一直走到了最后一栋,小Q从来都没有见到这么多的楼,所以他想知道他在每栋楼的位置处能看到多少栋楼呢?(当前面的楼的高度大于等于后面的楼时,后面的楼将被挡住)

 

输入描述:

 

输入第一行将包含一个数字n,代表楼的栋数,接下来的一行将包含n个数字wi(1<=i<=n),代表每一栋楼的高度。

1<=n<=100000;

1<=wi<=100000;

 

输出描述:

输出一行,包含空格分割的n个数字vi,分别代表小Q在第i栋楼时能看到的楼的数量。

 

输入例子1:

6

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栋楼。

 

这是一个双向单调栈的应用,小Q往左往右都只能看到单调递增的楼层,因此我们只需求出同一位置往左往右的单调递增序列数之和,再加上所在位置的楼层,便是答案了。

这里我用数组模拟栈,代码如下:

#include <stdio.h>
int main() {
    int i,n,j, x[100001],LtoR[100001],RtoL[100001],sum[100001];
    scanf("%d",&n);
    for(i=0;i<n;i++)
      scanf("%d",&x[i]);
    int indl=0,indr=0;
    for(i=0,j=n-1;i<n,j>=0;i++,j--){
      sum[i]+=indl;
      sum[n-i-1]+=indr;
//从左往右遍历(从右往左看)
      while(LtoR[indl-1]<=x[i]&&indl>0){
        indl --;//出栈操作
    }
//从右往左遍历(从左往右看)
    while(RtoL[indr-1]<=x[j]&&indr>0){
        indr --;//出栈操作
    }
      LtoR[indl]=x[i];//入栈
      indl ++;
      RtoL[indr]=x[j];//入栈
      indr ++;
  }
//注意加一
  for(i=0;i<n-1;i++)
    printf("%d ",sum[i]+1);
    printf("%d\n",sum[n-1]+1);
    return 0;
}
目录
相关文章
|
19天前
|
消息中间件 存储 搜索推荐
深入理解栈和队列(二):队列
深入理解栈和队列(二):队列
34 0
|
24天前
|
存储 消息中间件 NoSQL
Redis数据类型详解:选择合适的数据结构优化你的应用
Redis数据类型详解:选择合适的数据结构优化你的应用
|
2天前
|
C语言
数据结构中顺序栈的进栈和出栈用C语言表示
数据结构中顺序栈的进栈和出栈用C语言表示
11 1
|
12天前
|
存储 算法 调度
数据结构期末复习(3)栈和队列
数据结构期末复习(3)栈和队列
18 0
|
24天前
|
存储 缓存 算法
【算法与数据结构】栈的实现详解
【算法与数据结构】栈的实现详解
|
24天前
|
存储 算法 编译器
【数据结构】栈算法(算法原理+源码)
【数据结构】栈算法(算法原理+源码)
【数据结构】栈算法(算法原理+源码)
|
1月前
【栈】数据结构栈的实现
【栈】数据结构栈的实现
|
1月前
|
存储
数据结构--栈和队列
数据结构--栈和队列
|
1月前
|
存储 算法 数据处理
数据结构从入门到精通——栈
栈,作为一种后进先出(LIFO)的数据结构,在计算机科学中扮演着重要的角色。它的特性使得它在处理函数调用、括号匹配、表达式求值等问题时具有得天独厚的优势。然而,如果我们跳出传统思维的束缚,会发现栈的用途远不止于此。
58 0
|
1月前
|
C语言
数据结构之栈详解(C语言手撕)
数据结构之栈详解(C语言手撕)
37 1