力扣1944.队列中可以看到的人数--单调栈

思路:

  • 由题知一个人能 看到 他右边另一个人的条件是这两人之间的所有人都比他们两人 矮 ,也就是说,在自己右边第一个比自己高的人后面的人就肯定看不到了
  • 那么只需要找到右边第一个比自己高的人与自己之间的所有满足要求的人就行了,怎么找?一个个判断中间是否有不满足要求的人吗?可行,但太慢。通过分析,不难发现在此区间内满足要求的人身高呈递增增长,也就是说,只要左边有比自己高的人那么这个人肯定看不到:
  • 那么只需要判断指定范围内每有一个满足条件的人就将能看到人数加一就行了
    代码:
    class Solution {
    public:vector<int> canSeePersonsCount(vector<int>& heights) {int len = heights.size();vector<int> answer(len);    //记录每个人可以看到几个人for(int i = 0; i < len - 1; i++){   //遍历除最后一个人外的每一个人,因为最后一个人能见人数肯定是0if(heights[i + 1] >= heights[i]){answer[i] = 1;continue;}   //如果右边第一个人就比自己高,直接记为1,跳过此次循环answer[i] = 1;   //记录当前人可见人数,因为已经判断右边第一个人,所以初值为1int t = heights[i + 1]; //记录左边的最高人,初值为当前人右边的人for(int j = i + 2; j < len; j++){   //从当前人右边第二个开始判断是否可见if(heights[j] >= heights[i]){answer[i]++;break;}    //遇到比当前人更高的人,记录,并退出遍历if(heights[j] < t) continue;    //如果左边有比自己更高的人,则跳过t = heights[j];    //如果没有,则自己为当前最高的,更换最高人answer[i]++;    //记录,能到这里,说明满足条件}}return answer;}
    };

  • 这个方法是我一开始的想法,没有问题,但是......
     
  • 真狠啊
  • 显然O(n^2)是不行了,那么就得想一个更快的方法。通过分析,不难发现在之前的方法里可以优化的点是:对于某个人,只要他左边有一个比他更高的人,那么在那个比他更高的人之前的所有人都看不到他
  • 也就是说,对于某个值,只要把能看到他的人都记录完,此时他就不被需要了可以忽视了,也就是说可以使用一个栈将每个值记录,对于不再被需要的值就弹出,在弹出的过程中刚好记录可见人数,同时将维护单调栈,从栈底到栈顶,身高严格递减
    假设输入为heights = [10,6,8,5,11,9],对于这个输入——
    ih[i]入栈前入栈后可见人数解释
    59[][9]0
    411[9][11]111挡住9,弹出9
    35[11][11,5]1
    28[11,5][11,8]28挡住5,弹出5
    16[11,8][11,8,6]1
    010[11,8,6][11,10]310挡住8,6,弹出8,6

代码:

class Solution {
public:vector<int> canSeePersonsCount(vector<int>& heights) {int len = heights.size();stack<int> stack;   //栈vector<int> answer(len);    //记录可见人数for(int i = len - 1; i >= 0; i--){  //从最后一个开始压栈while(!stack.empty() && stack.top() < heights[i]){  //如果栈不为空且栈顶元素小于当前要压栈元素stack.pop();    //弹栈answer[i]++;    //记录}if(!stack.empty()) answer[i]++; //若栈不为空,则代表当前要压栈元素后边还有一个比之更高的人可见,记录stack.push(heights[i]);     //压栈}return answer;}
};

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/231489.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql保姆安装教程

前言&#xff1a;考完研回来&#xff0c;重新配置数据库的相关环境&#xff0c;按照本方法安装请确保你之前的MySQL已完全清除干净。 一.下载install文件 1.进入Mysql官网&#xff0c;点击下载 2.选择MySQL Installer for Windows 3.推荐选择第二个安装包 4.不登陆&#xff0c…

23 导航栏

效果演示 实现了一个响应式的导航栏&#xff0c;当鼠标悬停在导航栏上的某个选项上时&#xff0c;对应的横条会从左到右地移动&#xff0c;从而实现了导航栏的动态效果。 Code <div class"flex"><ul><li>1</li><li>2</li><l…

怎么快速修复mfc140.dll文件?解决mfc140.dll缺失的方法

面对计算机报告的 ​mfc140.dll​ 文件遗失错误&#xff0c;这通常表明系统中缺少一个关键的动态链接库文件&#xff0c;该文件对于运行以 Microsoft Foundation Class (MFC) 库编写的程序十分重要&#xff0c;尤其是那些需要图形界面的应用程序和一些游戏。若没有这个文件&…

【AI视野·今日Robot 机器人论文速览 第六十六期】Tue, 31 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Tue, 31 Oct 2023 Totally 39 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers DEFT: Dexterous Fine-Tuning for Real-World Hand Policies Authors Aditya Kannan, Kenneth Shaw, Shikhar Bahl, Pragna Ma…

【Minikube Prometheus】基于Prometheus Grafana监控由Minikube创建的K8S集群

文章目录 1. 系统信息参数说明2. Docker安装3. minikube安装4. kubectl安装5. Helm安装6. 启动Kubernetes集群v1.28.37. 使用helm安装Prometheus8. 使用helm安装Grafana9. Grafana的Dashboard设定10. 设定Prometheus数据源11. 导入Kubernetes Dashboard12. 实验过程中的常见问题…

软件设计模式 --- 类,对象和工厂模式的引入

Q1&#xff1a;什么是软件设计模式&#xff1f; A&#xff1a;软件设计模式&#xff0c;又称设计模式。它是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。综上&…

vmware安装redhat 7.6 操作系统

vmware安装redhat 7.6 操作系统 1、下载redhat 7.6 操作系统镜像文件2、安装redhat 7.6操作系统3、配置redhat 7.6 操作系统3.1、配置静态IP地址 和 dns3.2、查看磁盘分区3.3、查看系统版本 1、下载redhat 7.6 操作系统镜像文件 链接: 盘盘 zwzg 文件名&#xff1a;rhel-serv…

JVM 常用知识和面试题

1. 什么是JVM内存结构&#xff1f; jvm将虚拟机分为5大区域&#xff0c;程序计数器、虚拟机栈、本地方法栈、java堆、方法区&#xff1b; 程序计数器&#xff1a;线程私有的&#xff0c;是一块很小的内存空间&#xff0c;作为当前线程的行号指示器&#xff0c;用于记录当前虚拟…

LeetCode-无重复字符的最长子串(3)

题目描述&#xff1a; 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 代码&#xff1a; class Solution {public int lengthOfLongestSubstring(String s) {Set<Character> occnew HashSet<Character>();int lens.length();int…

OpenCASCADE MFC例子

OpenCASCADE MFC例子 说明 一直对OpenCASCADE一直都比较感兴趣&#xff0c;这个例子是我参考这位大神C幼儿园中班小朋友的专栏做出来的OpenCASCADE_C幼儿园中班小朋友的博客-CSDN博客 不过我用的是vcpkg的方式安装OpenCASCADE&#xff0c;这个需要注意一下&#xff0c;可能需…

HackTheBox - Medium - Linux - Awkward

Awkward Awkward 是一款中等难度的机器&#xff0c;它突出显示了不会导致 RCE 的代码注入漏洞&#xff0c;而是 SSRF、LFI 和任意文件写入/追加漏洞。此外&#xff0c;该框还涉及通过不良的密码做法&#xff08;例如密码重用&#xff09;以及以纯文本形式存储密码来绕过身份验…

Mybatis缓存实现方式

文章目录 装饰器模式Cache 接口及核心实现Cache 接口装饰器1. BlockingCache2. FifoCache3. LruCache4. SoftCache5. WeakCache 小结 缓存是优化数据库性能的常用手段之一&#xff0c;我们在实践中经常使用的是 Memcached、Redis 等外部缓存组件&#xff0c;很多持久化框架提供…

【物联网】手把手完整实现STM32+ESP8266+MQTT+阿里云+APP应用——第3节-云产品流转配置

&#x1f31f;博主领域&#xff1a;嵌入式领域&人工智能&软件开发 本节目标&#xff1a;本节目标是进行云产品流转配置为后面实际的手机APP的接入做铺垫。云产品流转配置的目的是为了后面能够让后面实际做出来的手机APP可以控制STM32/MCU&#xff0c;STM32/MCU可以将数…

【自学笔记】01Java基础-07面向对象基础-01封装

记录学习Java基础中有关面向对象编程的基础知识&#xff0c;包括面向对象思想&#xff0c;构造方法&#xff0c;封装思想&#xff0c;JavaBean。 1 面向对象概述 1.1 什么是面向对象编程 严谨来说&#xff1a;   面向对象编程&#xff08;Object-Oriented Programming&…

《深入理解Java虚拟机(第三版)》读书笔记:虚拟机类加载机制、虚拟机字节码执行引擎、编译与优化

下文是阅读《深入理解Java虚拟机&#xff08;第3版&#xff09;》这本书的读书笔记&#xff0c;如有侵权&#xff0c;请联系删除。 文章目录 第6章 类文件结构第7章 虚拟机类加载机制7.2 类加载的时机7.3 类加载的过程7.4 类加载器7.5 Java模块化系统 第8章 虚拟机字节码执…

手动创建idea SpringBoot 项目

步骤一&#xff1a; 步骤二&#xff1a; 选择Spring initializer -> Project SDK 选择自己的JDK版本 ->Next 步骤三&#xff1a; Maven POM ->Next 步骤四&#xff1a; 根据JDK版本选择Spring Boot版本 11版本及以上JDK建议选用3.2版本&#xff0c;JDK为11版本…

大数据 - 大数据入门第一篇 | 关于大数据你了解多少?

&#x1f436;1.1 概述 大数据&#xff08;BigData):指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合&#xff0c;是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。 大数据主要解决、海量数据的采…

torch.meshgrid和np.meshgrid的区别

numpy中meshgrid&#xff1a; 把数组a当作一行&#xff0c;再根据数组b的长度扩充行。 把数组b当作一列&#xff0c;再根据数组a的长度扩充列。 torch中meshgrid&#xff1a; 把数组a当作一列&#xff0c;再根据数组b的长度扩充列。 把数组b当作一行&#xff0c;再根据数组a的…

最优化理论期末复习笔记 Part 2

数学基础线性代数 从行的角度从列的角度行列式的几何解释向量范数和矩阵范数 向量范数矩阵范数的更强的性质的意义 几种向量范数诱导的矩阵范数 1 范数诱导的矩阵范数无穷范数诱导的矩阵范数2 范数诱导的矩阵范数 各种范数之间的等价性向量与矩阵序列的收敛性 函数的可微性与展…

Camtasia2024录屏软件简单实用的4K录制视频软件

Camtasia是一款功能强大的屏幕录制软件&#xff0c;适用于Windows和Mac操作系统。它具有简单的操作界面和丰富的编辑功能&#xff0c;coco玛奇朵可以让你轻松录制和编辑屏幕视频。Camtasia还支持添加文字、图像、动画等元素&#xff0c;同时提供了丰富的特效和滤镜功能&#xf…