牛客刷题日记1——腾讯2020(2逛街)

牛客刷题日记1——腾讯2020(2逛街)

题目描述:

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

算法分析:

暴力解法,时间复杂度O(n^2)会超时,参考大佬们的解答,单调栈解答可以AC。思路为,从左边和右边分别遍历,将小于arr[i]循环出栈,再将arr[i]进栈,保证栈是单调有序的。在每次循环开始是,用数组记录栈的大小,即为向左看和向右看能看到的楼房数。

Java代码:

import java.util.Scanner;
import java.util.Stack;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] arr = new int[n];
        for(int i = 0 ; i < n ; i++){
            arr[i] = sc.nextInt();
        }
        Stack st1 = new Stack<>(), st2 = new Stack<>();
        int[] leftLook=new int[n],rightLook = new int[n];
        int j;
        for(int i=0;i

结果截图:
牛客刷题日记1——腾讯2020(2逛街)_第1张图片

你可能感兴趣的:(牛客刷题日记1——腾讯2020(2逛街))