第一版,我本来打算是按照会议室的方式写的。每个房间放入连续的数组下标的序号。后来发现可能会出现同一个数组能够放入多个房间里,所以需要在每一轮开始前对房间进行排序。
本来自信慢慢的觉得自己能过,但是发现还是不行。
class Solution {
public:
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
if(intervals.empty())
return 0;
sort(intervals.begin(),intervals.end());
vector<vector<int>> room;
room.push_back({0});
for(int i = 1;i < intervals.size();i++){
bool add = false;
for(auto& q :room){
sort(room.begin(),room.end(),[&](const vector<int>&a,const vector<int>&b)
{return a.size() > b.size();});
int j = q.back();
if(intervals[j][1] <= intervals[i][0]){
q.push_back(i);
add = true;
break;
}
}
if(!add){
room.push_back({i});
}
}
//return room.size()-1;
vector<int> rs;
for(auto& q:room){
rs.push_back(q.size());
}
//int *maxS = *;
rs.erase(max_element(rs.begin(),rs.end()));
return accumulate(rs.begin(),rs.end(),0);
}
};
//我的想法:建立一个会议室,能够放入同一间会议室的会议就放入同一个区间,如果不能就不放入。
[[-3035,30075],[1937,6906],[11834,20971],[44578,45600],[28565,37578],[19621,34415],[32985,36313],[-8144,1080],[-15279,21851],[-27140,-14703],[-12098,16264],[-36057,-16287],[47939,48626],[-15129,-5773],[10508,46685],[-35323,-26257]]
后来想了下,找到最多的区间放置未必是最多的算法,如果一个区间跨度太大,能够包括题目当中给的测试数据的多个区间。删掉这个会比较合算。但是如果这个区间一开始就放入最长的房间当中,之后细碎的空间就放不进去了。
为了解决上面的那个问题,就用贪心算法,每次都保留细小的区间,抛弃跨度较大的区间。
//把区间按照区间结尾小的排序,优先选择区间小的数字。
class Solution {
public:
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
if(intervals.empty())
return 0;
sort(intervals.begin(),intervals.end(),[&](const vector<int>& a,const vector<int>& b)
{return a[1] < b[1];});
int tot = 0;
int pre = intervals[0][1];
for(int i = 1;i < intervals.size();i++){
if(intervals[i][0] < pre){
tot++;
}else {
pre = intervals[i][1];
}
}
return tot;
}
};