模拟
解法:模拟
把 $x$ 值相同的建筑放在一个 vector 里,对它们的 $y$ 值排序,就能知道每个建筑上下有没有其它建筑。左右的处理类似。
复杂度 $\mathcal{O}(n\log n)$。
参考代码(c++)
class Solution {
public:
int countCoveredBuildings(int n, vector<vector<int>>& buildings) {
int m = buildings.size();
int cnt[m];
memset(cnt, 0, sizeof(cnt));
typedef pair<int, int> pii;
// 把 x 值相同的建筑放在同一个 vector 里,对它们的 y 值排序
unordered_map<int, vector<pii>> X;
// 把 y 值相同的建筑放在同一个 vector 里,对它们的 x 值排序
unordered_map<int, vector<pii>> Y;
for (int i = 0; i < m; i++) {
X[buildings[i][0]].push_back({buildings[i][1], i});
Y[buildings[i][1]].push_back({buildings[i][0], i});
}
for (auto &p : X) {
auto &vec = p.second;
sort(vec.begin(), vec.end());
// 标记下面有其它建筑的房子
for (int i = 1; i < vec.size(); i++) cnt[vec[i].second]++;
// 标记上面有其它建筑的房子
for (int i = 0; i + 1 < vec.size(); i++) cnt[vec[i].second]++;
}
for (auto &p : Y) {
auto &vec = p.second;
sort(vec.begin(), vec.end());
// 标记左面有其它建筑的房子
for (int i = 1; i < vec.size(); i++) cnt[vec[i].second]++;
// 标记右面有其它建筑的房子
for (int i = 0; i + 1 < vec.size(); i++) cnt[vec[i].second]++;
}
int ans = 0;
// 需要有 4 个标记
for (int i = 0; i < m; i++) if (cnt[i] == 4) ans++;
return ans;
}
};