算法每日一题:队列中可以看到的人数 | 单调栈

大家好,我是星恒
今天是一道困难题,他的题解比较好理解,但是不好想出来,接下来就让我带大家来捋一捋这道题的思路,以及他有什么特征

题目: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:
image.png

输入: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 中所有数 互不相同

分析:
看到这道题,大家第一想到的一定是枚举每一种情况,然后依次与每一个值比较,记录比当前值大的值;当然,他的时间复杂度是O(n2),他的作用只能是为我们提供一些信息:
最大都是O(n2),说明优化大概率是O(n) 或者 O(nlogn);我们可以想到的方法,二分?利用一些特殊的数据结构?动归?等等。很明显这道题不能使用二分,因为没有折半的判断条件呀!所以我们可以拓展其他思维

从题目中的例子可以看出,对于某个人,他可以看到 比它小的人,并且这些人的规律是 单调递增,ok,看到单调性,我们肯定能想到这个数据结构:单调栈,没错,这道题的思路就是单调栈,但难点就在如何使用单调栈:

由于前面的看到的是一个单调递增的序列,并且我们需要从后向前来维护,所以我们维护一个从栈底到栈顶递减的一个栈。
同样,由于前面的人,看不到被后面的人挡住的比其(后面的这个人)小的人,即使这个人比它小,所以我们可以直接把他抛弃掉,这样前面的人只要将栈里面比它小的人统计,就可以知道它可以看多少人了,当然,统计后出栈即可,因为它挡住了前面的视线(看比它小的人的视线)

题解:

class Solution {public int[] canSeePersonsCount(int[] heights) {int n = heights.length;Deque<Integer> stack = new ArrayDeque<Integer>();int[] res = new int[n];for (int i = n - 1; i >= 0; i--) {int h = heights[i];while (!stack.isEmpty() && stack.peek() < h) {stack.pop();res[i]++;}if (!stack.isEmpty()) {res[i]++;}stack.push(h);}return res;}
}

如果大家有什么思考和问题,可以在评论区讨论,也可以私信我,很乐意为大家效劳。
好啦,今天的每日一题到这里就结束了,如果大家觉得有用,可以可以给我一个小小的赞呢,我们下期再见!

这里和大家说声不好意思,这周从元旦开始都没有发帖子,尤其每日一题,对不起!
原因是这今天都计划上午写贴子,晚上发贴子,但是由于这几天回了家里,稍微有点忙,并且和在学校相比,有些许不适应,所以一直没有顾上发,但其实我每天都在坚持写,今天我们把我这周攒下的每日一题都发出来了,大家感兴趣的可以去看看,让我们一起进步 ~~~

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

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

相关文章

Spring国际化的应用及原理详解

1. 简介 Spring国际化&#xff08;Spring Internationalization&#xff0c;简称i18n&#xff09;是Spring框架提供的一种机制&#xff0c;用于支持多语言的应用程序。它使得开发者能够轻松地在应用程序中实现不同语言的支持&#xff0c;从而满足全球化的需求。通过Spring国际…

面试必问究极重点之HashMap的底层原理

1.底层数据结构 JDK版本不同的数据结构 1.7 数组 链表 1.8 数组 &#xff08;链表 | 红黑树&#xff09; 2.添加数据put 在添加一个值的时候&#xff0c;首先会计算他的hash码&#xff0c;然后进行二次hash&#xff0c;在对当前长度取模得到在底层数组中的索引位置当取模完…

浅谈软件架构设计

软件架构基本知识&#xff1a; 关于软件架构&#xff0c;其实没有一个特定的定论。之所以要有软件架构&#xff0c;个人觉得是从逻辑上抽象出一些通用的设计模式&#xff0c;设计方法&#xff0c;开发框架&#xff0c;实现步骤&#xff0c;工程管理等。从容让软件开发&#xff…

electron——查看electron的版本(代码片段)

electron——查看electron的版本(代码片段)1.使用命令行&#xff1a; npm ls electron 操作如下&#xff1a; 2.在软件内使用代码&#xff0c;如下&#xff1a; console.log(process) console.log(process.versions.electron) process 里包含很多信息&#xff1a; process详…

【Linux】——基本指令(二)

&#x1f497;个人主页&#x1f497; ⭐个人专栏——数据结构学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 导读&#xff1a;1. vim 指令2. head指令3. tail指令4. tree指令5. 输出重定向6. echo指令7. wc指令8. | 字符9. date指令…

PCIe 6.0生态业内进展分析总结

上一篇&#xff0c;我们针对PCIe 6.0的功能更新与实现挑战做了简单的分析与总结。更多详细内容可以参考&#xff1a; 扩展阅读&#xff1a;浅析PCIe 6.0功能更新与实现的挑战 那么&#xff0c;PCIe 6.0已经发布了一段时间了&#xff0c;业内硬件支持PCIe 6.0目前有哪些进展呢…

Spring Security 6.x 系列(13)—— 会话管理之会话概念及常用配置

一、会话概念 在实现会话管理之前,我们还是先来了解一下协议和会话的概念,连协议和会话都不知道是啥,还谈啥管理。 1.1 http 协议 因为我们现在的会话,基本上都是基于HTTP协议的,所以在讲解会话之前,我再带各位复习一下HTTP协议。 1.1.1 概念 HTTP:超文本传输协议(…

uniapp获取日期

1.使用new Date()方法获取系统今天的日期&#xff0c;显示格式为&#xff1a;2023-10-28 <template><view class"content">{{date}}</view> </template> <script>export default {data() {return {date: new Date().toISOString().sl…

python开发案例教程-清华大学出版社(张基温)答案(4.2)

目录 练习 4.2 1. 代码分析题 2. 程序设计题 练习 4.2 1. 代码分析题 阅读下面的代码&#xff0c;给出输出结果。 &#xff08;1&#xff09; class A:def __init__(self,a,b,c):self.xabca A(3,5,7);b getattr(a,x);setattr(a,x,b3);print(a.x)18 &#xff08;2&…

python 正则-常见题目

1、邮箱 print(re.findall(r[\w-][\w-]\.[\w-], weidianqq.com))2、身份证号 xxxxxx yyyy MM dd 375 0 十八位 print(re.findall(r(?:18|19|(?:[23]\d))\d{2}, 2010)) # 年print(re.findall(r(?:0[1-9])|10|11|12, 11)) # 月print(re.findall(r(?:[0-2][1-9])|10|20|30|3…

面试算法93:最长斐波那契数列

题目 输入一个没有重复数字的单调递增的数组&#xff0c;数组中至少有3个数字&#xff0c;请问数组中最长的斐波那契数列的长度是多少&#xff1f;例如&#xff0c;如果输入的数组是[1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6&#xff0c;7&#x…

外包干了5个月,技术明显退步了...

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年12月份&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测…

周鸿祎分享大模型十大趋势:2024将出现杀手级应用

1月5日&#xff0c;“2023年风马牛年终秀”上&#xff0c;三六零&#xff08;601360.SH&#xff0c;下称“360”&#xff09;集团创始人周鸿祎分享了对2024年大模型发展趋势的十大预测&#xff0c;呼吁企业树立AI信仰&#xff0c;All in AI。他认为&#xff0c;创新才能破局&am…

ctfshow——信息搜集

文章目录 web 1web 2web 3web 4web 5web 6web 7web 8web 9web 10web 11web 12web 13web 14web 15web 16web 17web 18web 19web 20 web 1 题目提示开发注释未及时删除。 直接右键查看源代码。 web 2 在这关我们会发现&#xff1a;1&#xff09;无法使用右键查看源代码&…

Linux服务器的几种类型

Linux是一个开源操作系统内核&#xff0c;用作各种Linux发行版&#xff08;也称为“distros”&#xff09;的核心组件。由Linus Torvalds于1991年开发&#xff0c;Linux基于Unix操作系统。它以其稳定性、安全性和多功能性而闻名。 Linux的关键特点&#xff1a; 开源性质&#…

OpenCASCADE MFC例子

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

二叉树part04 算法

二叉树part04 今日任务: ● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和 1.110.平衡二叉树 110. 平衡二叉树 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(…

Shell:常用命令之dirname与basename

一、介绍 1、dirname命令用于去除文件名中的非目录部分&#xff0c;删除最后一个“\”后面的路径&#xff0c;显示父目录。 语法&#xff1a;dirname [选项] 参数 2、basename命令用于打印目录或者文件的基本名称&#xff0c;显示最后的目录名或文件名。 语法&#xff1a;basen…

[蓝桥杯学习] 树链剖分

定义 将树分割成若干条链&#xff0c;以维护树上的信息&#xff0c;若无特殊需求&#xff0c;一般是重链剖分。 重链剖分 如何重链剖分 两个dfs 第一个dfs是预处理各个结点的基本信息&#xff0c;第二个dfs是利用信息进行剖分&#xff08;dfs序&#xff09; 操作步骤 第一…

git在本地创建dev分支并和远程的dev分支关联起来

文章目录 git在本地创建dev分支并和远程的dev分支关联起来1. 使用git命令2. 使用idea2.1 先删除上面建的本地分支dev2.2 通过idea建dev分支并和远程dev分支关联 3. 查看本地分支和远程分支的关系 git在本地创建dev分支并和远程的dev分支关联起来 1. 使用git命令 git checkout…