题目:环形数组中每个人能看到的人数(成环版)
描述
有 n 个人站成一个圆圈,给你一个整数数组 heights , heights[i] 表示第 i 个人的身高。
规则:
1. 每个人只能朝一个方向看(可以绕一圈,但不能回头)。
2. 比当前矮的人:能看见,继续看。
3. 遇到大于或等于当前身高的人:能看见,但后面全部被挡住,停止。
4. 因为是环形,最多看到回到自己之前为止。
请返回一个数组 ans , ans[i] 是第 i 个人能看到的总人数。
class Solution {
public:
vector<int> circularCanSeePersonsCount(vector<int>& heights) {
int n = heights.size();
vector<int> ans(n, 0);
stack<int> st;
// 环形技巧:遍历 2n 个,从后往前
for (int i = 2 * n - 1; i >= 0; --i) {
int idx = i % n;
int cnt = 0;
// 比我矮:能看见,继续
while (!st.empty() && heights[idx] > heights[st.top()]) {
cnt++;
st.pop();
}
// 还有 >= 的:能看见这一个,然后挡住
if (!st.empty()) {
cnt++;
}
// 只赋值前 n 个
if (i < n) {
ans[idx] = cnt;
}
st.push(idx);
}
return ans;
}
};