把图分成一个个区间【端点为输入中出现过的端点】,求这些区间的高度【成为一个个矩形】,如果右区间高度不等于左区间,那么右区间的左端点即关键点
class Solution {
public:
vector<pair<int, int>> ans,all;
set<int> vis;
vector<pair<int, int>> getSkyline(vector<vector<int>>& buildings) {
if(buildings.empty()) return ans;
for (auto& x : buildings)
for (int i = 0; i < 2; ++i)
if (!vis.count(x[i]))
vis.insert(x[i]), all.push_back(pair<int, int>(x[i], 0));
sort(all.begin(), all.end(), [](const pair<int, int> a, const pair<int, int> b) {return a.first < b.first; });
sort(buildings.begin(), buildings.end(), [](const vector<int> a, const vector<int> b) {return a[0] < b[0]; });
int l = 0;
for (auto& x : buildings) {
while (x[0] != all[l].first) ++l;
for (int k = l; all[k].first != x[1]; ++k)
all[k].second = max(all[k].second, x[2]);
}
ans.push_back(all[0]);
for (int i = 1; i < all.size(); ++i)
if (all[i].second != all[i - 1].second) ans.push_back(all[i]);
return ans;
}