力扣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.mzph.cn/news/599571.shtml

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

相关文章

JDBC数据库访问——数据库操作

与指定的数据库建立连接后&#xff0c;就可以使用JDBC提供的API对数据库进行操作&#xff0c;包括查询、新增、更新、删除等。 1.查询操作 和数据库建立连接后&#xff0c;对数据库表进行查询操作的步骤如下&#xff1a; ①创建statement对象 由已创建的Connection对象con调…

透明OLED屏:种类与技术特点

作为一名专注于OLED技术研发的工程师&#xff0c;同时在尼伽工作多年&#xff0c;有幸能够参与到透明OLED屏的研发过程中。透明OLED屏作为一种新型显示技术&#xff0c;以其独特的透明特性和优秀的画质表现&#xff0c;正逐渐在各个领域崭露头角。在这篇文章中&#xff0c;我将…

GROUP_CONCAT报错解决

有如下表 其中awardee和awardee_unit都是保存的json类型的字符串, awardee是多个人员id, awardee_unit是部门的全路径 查询时要注意转换 需要将name拼接起来合并成一行,直接 GROUP_CONCAT 会报错 百度的大部分答案是修改数据库配置去掉严格模式,如果不方便修改数据库可以这样…

使用Go语言的HTTP客户端库进行API调用

随着微服务架构和RESTful API的普及&#xff0c;API调用成为了日常开发中的常见任务。Go语言提供了多种工具和库来帮助开发者轻松地与API进行交互。本文将介绍如何使用Go语言的HTTP客户端库进行API调用。 在Go语言中&#xff0c;标准库中的net/http包提供了基本的HTTP客户端功…

2023春季李宏毅机器学习笔记 06 :Diffusion Model 原理剖析

资料 课程主页&#xff1a;https://speech.ee.ntu.edu.tw/~hylee/ml/2023-spring.phpGithub&#xff1a;https://github.com/Fafa-DL/Lhy_Machine_LearningB站课程&#xff1a;https://space.bilibili.com/253734135/channel/collectiondetail?sid2014800 一、想法概念 Q1&…

基于哈里斯鹰算法优化的Elman神经网络数据预测 - 附代码

基于哈里斯鹰算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于哈里斯鹰算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于哈里斯鹰优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…

C++学习day--25 俄罗斯方块游戏图像化开发

项目分析 项目演示、项目分析 启动页面 启动页面&#xff1a; 分析&#xff1a; 开发环境搭建 1&#xff09;安装vc2010, 或其他vs版本 2&#xff09;安装easyX图形库 代码实现: # include <stdio.h> # include <graphics.h> void welcome(void) { initgraph(55…

鹿目标检测数据集VOC格式500张

鹿&#xff0c;一种优雅而神秘的哺乳动物&#xff0c;以其优美的外形和独特的生态习性而备受人们的喜爱。 鹿的体型通常中等&#xff0c;四肢细长&#xff0c;身体线条流畅。它们的头部较小&#xff0c;耳朵大而直立&#xff0c;眼睛明亮有神。鹿的毛色因品种而异&#xff0c;…

计算机Java项目|Springboot医院固定资产系统

项目编号&#xff1a;L-BS-ZXBS-06 一&#xff0c;环境介绍 语言环境&#xff1a;Java: jdk1.8 数据库&#xff1a;Mysql: mysql5.7 应用服务器&#xff1a;Tomcat: tomcat8.5.31 开发工具&#xff1a;IDEA或eclipse 二&#xff0c;项目简介 困扰医院管理的许多问题当…

Spring学习 Spring IOC

创建工程&#xff1a; 2.1.程序的耦合 耦合&#xff1a;耦合指的就是对象之间的依赖关系。对象之间的耦合越高&#xff0c;维护成本越高。 案例&#xff1a;没有引入IOC容器时系统的Web层、业务层、持久层存在耦合 /*** 持久层实现类*/ public class UserDaoImpl implements U…

SpringBoot内嵌的Tomcat启动过程以及请求

1.springboot内嵌的tomcat的pom坐标 启动后可以看到tomcat版本为9.0.46 2.springboot 内嵌tomcat启动流程 点击进入SpringApplication.run()方法里面 看这次tomcat启动相关的核心代码refreshContext(context);刷新上下文方法 public ConfigurableApplicationContext run(Stri…

微信小程序如何搜索iBeacon设备

1.首先在utils文件夹下创建bluetooth.js和ibeacon.js 2.在 bluetooth.js文件中写入 module.exports {initBluetooth: function () {// 初始化蓝牙模块wx.openBluetoothAdapter({success: function (res) {console.log(蓝牙模块初始化成功);},fail: function (res) {console.l…

如何使用loki查询日志中大于某一数字的值的日志

简介 loki是一款轻量级的日志收集中间件&#xff0c;比elk体系占用的内存更小&#xff0c;采用go语言开发&#xff0c;可以利用grafana来查询loki中存储的日志&#xff0c;loki存储日志只对提前预设的标签做索引&#xff0c;所以日志存储空间占用比elk小很多。 方法 loki只对…

深圳易图讯实景三维数字孪生系统 实景三维电子沙盘

深圳易图讯实景三维数字孪生系统是一款基于三维地理空间的数字孪生系统&#xff0c;首先&#xff0c;该系统集成了多维度地理空间数据&#xff0c;可以将各类数据与应用需求进行充分整合&#xff0c;实现数据跨界融合、场景全角度可视等功能。其次&#xff0c;该系统具备智能化…

在 Windows 中安装 SQLite 数据库

在 Windows 上安装 SQLite 步骤1 请访问 SQLite 下载页面&#xff0c;从 Windows 区下载预编译的二进制文件 ​ 步骤2 您需要下载 sqlite-dll-win-x64-3440200.zip 和 sqlite-tools-win-x64-3440200.zip 压缩文件 步骤3 创建文件夹 C:\Program Files\SQLite&#xff0c;并在…

PostGIS学习教程十七:线性参考

PostGIS学习教程十七&#xff1a;线性参考 线性参考是一种表示要素的方法&#xff0c;这些要素可以通过引用一个基本的线性要素来描述。使用线性参照建模的常见示例包括&#xff1a; 公路资产&#xff0c;这些资产使用公路网络沿线的英里来表示。 道路养护作业&#xff0c;指…

java大数据hadoop2.92安装伪分布式文件系统

Apache Hadoop 3.3.6 – Hadoop: Setting up a Single Node Cluster. 1、解压缩到某个路径 /usr/local/hadoop 2、修改配置文件 /usr/local/hadoop/etc/hadoop/hadoop-env.sh export JAVA_HOME/usr/local/javajdk 3、修改配置文件 /usr/local/hadoop/etc/hadoop/core-sit…

(八)矩阵按键

文章目录 本章学习类比独立按键矩阵按键原理图三行代码法简单概述代码书写键码推算如何使用短按键长按键不松手长按键松手长按键 状态机法简单概述代码书写键码推算如何使用短按键长按键不松手长按键松手长按键 部分代码展示现象演示 本章学习类比独立按键 矩阵按键原理图 三行…

Swagger Editor 教程:从入门到精通编写 API 文档

在 API 开发的领域中&#xff0c;Swagger 以其卓越的使用效率与便捷性&#xff0c;备受开发者欢迎。它是一个强大的接口设计工具&#xff0c;允许开发人员对 RESTful API 进行高效的设计、构建及测试工作。本文旨在深入探讨其中一个子工具——Swagger Editor的使用介绍及它的有…

《知识扫盲》ROS和ROS2对比

文章摘选自&#xff1a;ROS与ROS2对比 1.ROS问题举例 ROS的设计目标是简化机器人的开发&#xff0c;如何简化呢&#xff1f;ROS为此设计了一整套通信机制&#xff08;话题、服务、参数、动作&#xff09;。 通过这些通信机制&#xff0c;ROS实现了将机器人的各个组件给的连接…