#1288.删除被覆盖区间
官方题解:
class Solution {
public:
int removeCoveredIntervals(vector<vector<int>>& intervals) {
int n = intervals.size();
sort(intervals.begin(), intervals.end(), [](const vector<int>& u, const vector<int>& v) {
return u[0] < v[0] || (u[0] == v[0] && u[1] > v[1]);
});
int ans = n;
int rmax = intervals[0][1];
for (int i = 1; i < n; ++i) {
if (intervals[i][1] <= rmax) {
--ans;
}
else {
rmax = max(rmax, intervals[i][1]);
}
}
return ans;
}
};
自己写得 :
class Solution {
public:
int removeCoveredIntervals(vector<vector<int>>& intervals) {
//排序
sort(intervals.begin(),intervals.end(),cmp());
int result=intervals.size();
int maxR=intervals[0][1];
for(int i=1;i<intervals.size();i++){
if(intervals[i][1]<=maxR){
result--;
}
else{
maxR=intervals[i][1];
}
}
return result;
}
private:
struct cmp{
bool operator()(vector<int> &v1,vector<int> &v2){
if(v1[0]<v2[0]){
return true;
}
if(v1[0]==v2[0]&&v1[1]>v2[1]){
return true;
}
return false;
}
};
};
#218.天际线问题
class Solution {
public:
vector<vector<int>> getSkyline(vector<vector<int>>& buildings) {
vector<pair<int,int>> h;
multiset<int> m;
vector<vector<int>> res;
//1、将每一个建筑分成“两个部分”,例如:[2,9,10]可以转换成[2,-10][9,10],我们用负值来表示左边界
for(const auto& b:buildings)
{
h.push_back({b[0], -b[2]});
h.push_back({b[1], b[2]});
}
//2、根据x值对分段进行排序
sort(h.begin(),h.end());
int prev = 0, cur = 0;
m.insert(0);
//3、遍历
for (auto i:h)
{
if (i.second < 0) m.insert(-i.second); //左端点,高度入堆
else m.erase(m.find(i.second)); //右端点,高度出堆
cur = *m.rbegin(); //当前最大高度高度
if (cur != prev) { //当前最大高度不等于最大高度perv表示这是一个转折点
res.push_back({i.first, cur}); //添加坐标
prev = cur; //更新最大高度
}
}
return res;
}
};