都是利用贪心的解法,形成局部最优
给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
注意:
可以认为区间的终点总是大于它的起点
区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。
示例 1:
输入: [ [1,2], [2,3], [3,4], [1,3] ]
输出: 1
解释: 移除 [1,3] 后,剩下的区间没有重叠。
题解:
class Solution {
public:
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
if (intervals.size()==0) return 0;
//先排序
sort(intervals.begin(),intervals.end());
//维护一个left
int left=intervals[0][1];
int count=0;
for (int i=1;i<intervals.size();i++){
if (intervals[i][0] < left){
count++;
left=min(left,intervals[i][1]);
}
else{
left=intervals[i][1];
}
}
return count;
}
};
解法2:
class Solution {
public:
static bool compare(vector<int> a, vector<int> b){
return a[1] < b[1];
}
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
if (intervals.size()==0) return 0;
sort(intervals.begin(),intervals.end(),compare);
int left=intervals[0][1];
int count=0;
for (int i=1;i<intervals.size();i++){
if(intervals[i][0] < left && intervals[i][1] >= left){
count++;
}
else{
left=intervals[i][1];
}
}
return count;
}
};
力扣406:假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。
注意:
总人数少于1100人。
示例
输入:
[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]
输出:
[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]
解:
class Solution {
public:
static bool compare(const vector<int>& a, const vector<int>& b) {
if (a[0] > b[0]) {
return true;
}
if (a[0] == b[0] && a[1] < b[1]) {
return true;
}
return false;
}
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
sort(people.begin(),people.end(),compare);
vector<vector<int>> res;
for (int i = 0; i < people.size(); i++) {
res.insert(res.begin() + people[i][1], people[i]);
}
return res;
}
};