【单调栈】LeetCode:1944队列中可以看到的人数

作者推荐

【贪心算法】【中位贪心】.执行操作使频率分数最大

题目

有 n 个人排成一个队列,从左到右 编号为 0 到 n - 1 。给你以一个整数数组 heights ,每个整数 互不相同,heights[i] 表示第 i 个人的高度。
一个人能 看到 他右边另一个人的条件是这两人之间的所有人都比他们两人 矮 。更正式的,第 i 个人能看到第 j 个人的条件是 i < j 且 min(heights[i], heights[j]) > max(heights[i+1], heights[i+2], …, heights[j-1]) 。
请你返回一个长度为 n 的数组 answer ,其中 answer[i] 是第 i 个人在他右侧队列中能 看到 的 人数 。
示例 1:
输入:heights = [10,6,8,5,11,9]
输出:[3,1,2,1,1,0]
解释:
第 0 个人能看到编号为 1 ,2 和 4 的人。
第 1 个人能看到编号为 2 的人。
第 2 个人能看到编号为 3 和 4 的人。
第 3 个人能看到编号为 4 的人。
第 4 个人能看到编号为 5 的人。
第 5 个人谁也看不到因为他右边没人。
示例 2:
输入:heights = [5,1,2,3,10]
输出:[4,1,1,1,0]
提示:
n == heights.length
1 <= n <= 105
1 <= heights[i] <= 105
heights 中所有数 互不相同

分析

从右向左遍历所有人(i从大到小),sta记录所有右边的人。如果i1 < i2,且heights[i1] > hights[i2],则前面的任何人到看不到i2,被i1所挡。淘汰i2后,sta从栈底到栈顶降序。
如果当前元素高于栈顶元素,则当前元素看得到栈顶。两者之间没有人高于等于栈顶之人,否则栈顶之人早出栈了。
注意:栈顶第一个高于等于当前人也可以看到,只是看不到后面的人。
时间复杂度: o(n),每个人顶多出栈入栈一次。

代码

核心代码

class Solution {
public:vector<int> canSeePersonsCount(vector<int>& heights) {m_c = heights.size();vector<int> vRet(m_c);stack<int> sta;for (int i = m_c - 1; i >= 0; i--){while (sta.size() && (sta.top() < heights[i])){vRet[i]++;sta.pop();}vRet[i] += !sta.empty();while (sta.size() && (sta.top()== heights[i])){sta.pop();}sta.emplace(heights[i]);}return vRet;}int m_c;
};

测试用例

template<class T>
void Assert(const T& t1, const T& t2)
{assert(t1 == t2);
}template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{if (v1.size() != v2.size()){assert(false);return;}for (int i = 0; i < v1.size(); i++){Assert(v1[i], v2[i]);}
}int main()
{vector<int> heights;{Solution slu;heights = { 10,6,8,5,11,9 };auto res = slu.canSeePersonsCount(heights);Assert({ 3,1,2,1,1,0 }, res);}{Solution slu;heights = { 5,1,2,3,10 };auto res = slu.canSeePersonsCount(heights);Assert({ 4,1,1,1,0 }, res);}//CConsole::Out(res);
}

2023年3月版:二分查找

class Solution {
public:
vector canSeePersonsCount(vector& heights) {
m_c = heights.size();
vector vRet(m_c);
vector vDescHeight;
for (int i = m_c - 1; i >= 0; i–)
{
auto iNum = std::upper_bound(vDescHeight.begin(), vDescHeight.end(), heights[i],std::greater()) - vDescHeight.begin();
if (iNum > 0)
{
vRet[i] = vDescHeight.size() - (iNum - 1);
}
else
{
vRet[i] = vDescHeight.size();
}
while (vDescHeight.size() && (vDescHeight.back() <= heights[i]))
{
vDescHeight.pop_back();
}
vDescHeight.push_back(heights[i]);
}
return vRet;
}
int m_c;
};

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快

速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关

下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法C++ 实现。

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

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

相关文章

智能优化算法应用:基于黑寡妇算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于黑寡妇算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于黑寡妇算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.黑寡妇算法4.实验参数设定5.算法结果6.参考文…

【ECharts】折线图

文章目录 折线图1折线图2折线图3示例 参考&#xff1a; Echarts官网 Echarts 配置项 折线图1 带X轴、Y轴标记线&#xff0c;其中X轴是’category’ 类目轴&#xff0c;适用于离散的类目数据。 let myChart echarts.init(this.$refs.line_chart2); let yList [400, 500, 6…

QEMU源码全解析 —— virtio(19)

接前一篇文章&#xff1a; 上回书继续讲解virtio_pci_driver的probe回调函数virtio_pci_probe()&#xff0c;在讲到第5段代码的时候&#xff0c; if (force_legacy) {rc virtio_pci_legacy_probe(vp_dev);/* Also try modern mode if we cant map BAR0 (no IO space). */if (r…

探索数据宇宙之飞船 -- python进阶函数numpy

导读&#xff1a;NumPy以其强大的多维数组对象和广泛的数学函数库著称。这些特性使得NumPy成为不仅在学术研究&#xff0c;也在工业界广泛应用的工具。无论是机器学习算法的开发、数据分析、还是复杂的数学模型的构建&#xff0c;NumPy都扮演着举足轻重的角色。 目录 Numpy简…

凝思虚拟机网络配置

1、输入验证码激活&#xff0c;不激活不能使用网络服务 2、启用网卡 ifconfig eth0 up 3、配置网络 vi /etc/network/interfaces&#xff0c;填写网卡eth0相关信息 auto eth0 allow-hotplug eth0 iface eth0 inet static address 10.1.104.210 netmask 255.255.0.0…

2-负载均衡、反向代理

负载均衡、反向代理 upstream server即上游服务器&#xff0c;指Nginx负载均衡到的处理业务的服务器&#xff0c;也可以称之为real server,即真实处理业务的服务器。 对于负载均衡我们要关心的几个方面如下&#xff1a; 上游服务器配置&#xff1a;使用upstream server配置上…

2023年中国法拍房用户画像和数据分析

法拍房主要平台 法拍房主要平台有3家&#xff0c;分别是阿里、京东和北交互联平台。目前官方认定纳入网络司法拍卖的平台共有7家&#xff0c;其中阿里资产司法拍卖平台的挂拍量最大。 阿里法拍房 阿里法拍房数据显示2017年&#xff0c;全国法拍房9000套&#xff1b;2018年&a…

C++ 图论之树的重心和直径

1. 重心 什么是树的重心&#xff1f; 物理学而言&#xff0c;重心是指地球对物体中每一微小部分引力的合力作用点&#xff0c;物体受力最集中的那一个点。数学上的重心是指三角形的三条中线的交点。 树的重心也称为质点&#xff0c;有一个很官方的定义&#xff1a;如果在树中…

【jvm从入门到实战】(九) 垃圾回收(2)-垃圾回收器

垃圾回收器是垃圾回收算法的具体实现。 由于垃圾回收器分为年轻代和老年代&#xff0c;除了G1之外其他垃圾回收器必须成对组合进行使用 垃圾回收器的组合使用关系图如下。 常用的组合如下: Serial&#xff08;新生代&#xff09; Serial Old&#xff08;老年代&#xff09; Pa…

嵌入式串口输入详细实例

学习目标 掌握串口初始化流程掌握串口输出单个字符掌握串口输出字符串掌握通过串口printf熟练掌握串口开发流程学习内容 需求 串口循环输出内容到PC机。 串口数据发送 添加Usart功能。 首先,选中Firmware,鼠标右键,点击Manage Project Items 接着,将gd32f4xx_usart.c添…

爱心集市,走进黄埔区老人院

为了满足老人的日常生活需求&#xff0c;提升他们的生活质量&#xff0c;将便民服务下沉到黄埔区老人院&#xff0c;让老人能在家门口享受到务实亲切的便民服务。12月14日上午&#xff0c;黄埔区平安促进会联合黄埔区老人院社工部在黄埔区老人院开展“惠捷购&#xff0c;乐生活…

万兆网络之疑难杂症(一)

症状&#xff1a;电话线测线仪4芯全亮&#xff0c;插上话机不亮 由于装修方没有按要求布线&#xff0c;导致没有电话线用&#xff0c;因此分网线用于电话线 测试网线8芯全亮&#xff0c;分四芯用端子接电话线&#xff0c;再压电话线水晶头&#xff0c;再测水晶头全亮&#xf…