2024.1.5力扣每日一题——队列中可以看到的人数

2024.1.5

      • 题目来源
      • 我的题解
        • [方法一 链表+暴力](#方法一 链表+暴力)
        • [方法二 单调栈](#方法二 单调栈)

题目来源

力扣每日一题;题序:1944

我的题解

啊啊啊!!!看到题的瞬间就想到了单调栈,但是结果......方向考虑反了

方法一 链表+暴力

分析可知,当前位置能看见的是遇见右边比当前位置更高的之前的所有的一个递增序列。

计算每个位置右侧满足的递增序列的长度

注:该方法无法通过时间限制。
时间复杂度 :O( n 2 n^2 n2)
空间复杂度:O(n)

java 复制代码
public int[] canSeePersonsCount(int[] heights) {
        LinkedList<Integer> list=new LinkedList<>();
        int n=heights.length;
        int[] res=new int[n];
        for(int i=0;i<n-1;i++){
            int j=i+1;
            for(;j<n;j++){
                if(heights[j]>heights[i]){
                    res[i]=list.size()+1;
                    break;
                }
                if(!list.isEmpty()&&list.getFirst()>heights[j]){
                    continue;
                }
                list.addLast(heights[j]);
            }
            if(j==n){
                res[i]=list.size();
            }
            list.clear();
        }
        return res;
    }
方法二 单调栈

分析图例可以发现,第 0个人可以看到的三个人的身高是严格递增的。通过分析是可以验证这个规律,如果满足 i<j,此时下标为 j 且靠后的人比下标为 i且靠前的人矮,那么下标为 j 的人无法被下标 i之前的人看到。根据这个规律,可以想到利用单调栈来解决这个问题。从队伍末尾开始,维护一个单调栈,从栈底到栈顶,身高严格递减。
时间复杂度 :O(n)
空间复杂度:O(n)

java 复制代码
public int[] canSeePersonsCount(int[] heights) {
        Deque<Integer> stack=new LinkedList<>();
        int n=heights.length;
        int[] res=new int[n];
        //从右到左维护单调减栈
        for(int i=n-1;i>=0;i--){
           int cur=heights[i];
           while(!stack.isEmpty()&&stack.peek()<cur){
               stack.pop();
               res[i]++;
           }
           if(!stack.isEmpty()){
               res[i]++;
           }
           stack.push(cur);
        }
        return res;
    }

有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~

相关推荐
ic爱吃蓝莓10 分钟前
数据结构 | HashMap原理
数据结构·学习·算法·链表·哈希算法
add45a11 分钟前
C++编译期数据结构
开发语言·c++·算法
灰色小旋风14 分钟前
力扣21 合并两个有序链表(C++)
c++·leetcode·链表
2401_8914821744 分钟前
C++模块化编程指南
开发语言·c++·算法
沉鱼.4444 分钟前
树、堆的题目集
算法
暮冬-  Gentle°1 小时前
自定义类型转换机制
开发语言·c++·算法
2301_816651221 小时前
嵌入式C++低功耗设计
开发语言·c++·算法
机器学习之心1 小时前
PSO-LightGBM-ABKDE粒子群算法优化轻量级梯度提升机自适应带宽核密度估计多变量回归区间预测Matlab实现
算法·matlab·回归·abkde·自适应带宽核密度估计·pso-lightgbm·粒子群算法优化轻量级梯度提升机
HelloTonyGo1 小时前
个人游戏笔记本免费“养龙虾”(Win10+WSL2+OpenClaw 部署与配置指南)
windows·ubuntu·wsl2·openclaw
待续3011 小时前
OpenClaw 安装及使用教程(Windows / macOS / Linux)
linux·windows·macos