1944. 队列中可以看到的人数(单调栈)

阅读: 评论:0

1944. 队列中可以看到的人数(单调栈)

1944. 队列中可以看到的人数(单调栈)

1944. 队列中可以看到的人数

第一次尝试困难的题目,不过看评论区说好像配不上困难这个级别,但我做不出来😭

毫无技巧的暴力解法(超时)

class Solution {
public:vector<int> canSeePersonsCount(vector<int>& heights) {vector<int> result;int num=0;  //看到的人for(int i=0;i<heights.size()-1;i++){for(int j=i+1;j<heights.size();j++){if(j==i+1)num++;//当人就在他隔壁时,一定看得到else{if(min(heights[i],heights[j])>*max_element(heights.begin()+i+1,heights.begin()+j))num++;}}result.push_back(num);num=0;}result.push_back(0);//最后一个看到的一定是0个人return result;}
};

逻辑上没有错误,但是效率低下。

可以使用单调栈求解,要弄清楚单调栈,我们还是先做一下相对基础的题目,739. 每日温度(C++)单调栈的应用

逆序遍历 + 单调栈

官方解法

class Solution {
public:vector<int> canSeePersonsCount(vector<int>& heights) {int n = heights.size();vector<int> result(n);stack<int> s;   //可能看到的人的序列for(int i = n-1;i>=0;i--){ while(!s.empty()){result[i]++;if(heights[i]>p()]){s.pop();    //因为当前的人的身高高于后面的人,所以再前的人也看不到后面的人,被挡住了。}else{break;		//如果遇到高的,那后面就肯定看不到了,直接break;}}s.push(i);}return result;}
};

这里把!s.empty()heights[i]>p()]条件分开。

因为之前遇到的单调栈是合在一起的,下面是我写的版本,两个条件不分开。

class Solution {
public:vector<int> canSeePersonsCount(vector<int>& heights) {int n = heights.size();vector<int> result(n);stack<int> s;   for (int i = n - 1; i >= 0; i--) {while (!s.empty()&& heights[i]>p()]) {	//这里是遇到高的就跳出循环result[i]++;s.pop();}if(!s.empty())result[i]++;//所以这里还要算上那个高的。s.push(i);}return result;}
};

本文发布于:2024-02-01 22:08:31,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170679650939732.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:可以看到   队列   单调   人数
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23