分享|环圈比我高的人
59
2026.03.03
2026.03.03
发布于 广东

题目:环形数组中每个人能看到的人数(成环版)

描述

有  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;

}

};

评论 (0)