PDD笔试(20250325)——身高排序

题目内容

N个同学排成一列,最理想的情况是按身高从小到大排列,这样每个人的视线都不会被遮挡,可以看到他前面的所有人。但由于同学们没有那么听话,可能会出现高个子同学排在前面的情况,导致后面的同学视线被遮挡。多多想用一个指标来衡量队列的整齐程度:每个同学能看到的同学的总数,这个值越大,说明队列越整齐。请你帮多多计算一下

具体来说,对于第1个同学,如果第i+ 1、i+ 2、i+ 3个同学都比他矮,i+ 4个同学比他高(或一样高),则他能看到4个同学,但由于视线被遮挡,第i+ 5、i+ 6..、i+ r个同学都无法再看到(即便第i+ z的身高比i + 4高)

单调栈可解:

import java.util.*;


public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        int[] hight = new int[num];
        ArrayDeque<Integer> st = new ArrayDeque<>();
        for(int i = 0; i < num; ++i){
            hight[i] = sc.nextInt();
        }

        int[] res = new int[num];
        for (int i = num-1; i >= 0; --i){
            while (!st.isEmpty() && hight[i] > hight[st.peek()])    //当前元素大于栈顶元素,则弹出栈顶元素
                st.pop();
            if (!st.isEmpty() && hight[i] == hight[st.peek()])  //当前元素等于栈顶,则只算1人
                res[i] = st.peek() - i;
            else if(!st.isEmpty())      //当前元素小于栈顶元素,则计算差值
                res[i] = st.peek() - i;
            else        //栈空,则从当前元素到默认都计入
                res[i] = (num- 1) - i ;
            st.push(i);
        }
        System.out.println(Arrays.stream(res).sum());
    }
}

}

全部评论

相关推荐

03-23 18:08
门头沟学院 Java
点赞 评论 收藏
分享
02-26 20:48
门头沟学院 Java
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务