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;
    }

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

相关推荐
写代码的小球1 小时前
求模运算符c
算法
程序视点4 小时前
Window 10文件拷贝总是卡很久?快来试试这款小工具,榨干硬盘速度!
windows
大千AI助手4 小时前
DTW模版匹配:弹性对齐的时间序列相似度度量算法
人工智能·算法·机器学习·数据挖掘·模版匹配·dtw模版匹配
wuk9985 小时前
基于MATLAB编制的锂离子电池伪二维模型
linux·windows·github
lzb_kkk6 小时前
【C++】C++四种类型转换操作符详解
开发语言·c++·windows·1024程序员节
YuTaoShao6 小时前
【LeetCode 热题 100】48. 旋转图像——转置+水平翻转
java·算法·leetcode·职场和发展
生态遥感监测笔记6 小时前
GEE利用已有土地利用数据选取样本点并进行分类
人工智能·算法·机器学习·分类·数据挖掘
Tony沈哲7 小时前
macOS 上为 Compose Desktop 构建跨架构图像处理 dylib:OpenCV + libraw + libheif 实践指南
opencv·算法
刘海东刘海东7 小时前
结构型智能科技的关键可行性——信息型智能向结构型智能的转变(修改提纲)
人工智能·算法·机器学习