# 1944. Number of Visible People in a Queue
* hard
* rating : 2105
題目 :
給一個heights數組代表每個人的身高,回傳每個人可以看到的隊伍人數為多少,並且當 $i$人可以看到$j$人當i < j且
$min(heights[i], heights[j]) >$
$max(heights[i+1], heights[i+2], ..., heights[j-1]).$
方法 : 第一個先暴力 但過不了 因$1 <= n <= 10^5$
```cpp=
class Solution {
public:
//暴力
vector<int> canSeePersonsCount(vector<int>& nums) {
int n = nums.size();
vector<int> res(n,0);
for(int i =0;i < n;i++){
int pre = 0;
for(int j = i+1;j<n;j++){
if(nums[j] > pre){
res[i]++;
pre = nums[j];
if(nums[j] > nums[i])break;
}
}
}
return res;
}
};
```
時間O(n^2) 空間O(n)
方法 : monotonic stack
題目提及,當有k在i,j之間,若height[i] < height[k] 則j就不會被看到,此時j為無用數據不須保存,因此我們從右邊往左邊遍歷,stack內為遞減。
```cpp=
class Solution {
public:
//monotonic stack
vector<int> canSeePersonsCount(vector<int>& nums) {
int n = nums.size();
vector<int> res(n,0);
stack<int> st;
for(int i = n-1; i >= 0;i--){
while(!st.empty() && st.top() < nums[i]){
//nums[i]擋住st.top(top為無用數據-彈出)
res[i]++;
st.pop();
}
if(!st.empty())res[i]++;// nums[k]的部分
st.push(nums[i]);
}
return res;
}
};
```
由左往右的邏輯有點不一樣
```cpp=
class Solution {
public:
//monotonic stack
vector<int> canSeePersonsCount(vector<int>& nums) {
int n = nums.size();
vector<int> res(n,0);
stack<int> st;// 處存index
for(int i = 0;i< n;i++){
while(!st.empty() && nums[st.top()] < nums[i]){//看到比top更大的元素
res[st.top()]++;//top加上最後一次 就被擋住 看不到其他東西
st.pop();//top的數據沒用了
}
if(!st.empty())res[st.top()]++;
//有點像回頭看,當nums[st.top] > nums[i]
//則st.top的元素可以看到nums[i]因此++
st.push(i);
}
return res;
}
};
```
時間O(n) 空間O(n)