无重叠区间(经典贪心leetcode435)-------------------c++实现
题目表述
给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。
样例
输入: intervals = [[1,2],[2,3],[3,4],[1,3]]
输出: 1
解释: 移除 [1,3] 后,剩下的区间没有重叠。
条件
1 <= intervals.length <= 105
intervals[i].length == 2
-5 * 104 <= starti < endi <= 5 * 104
思路
按右结点的大小排序,先找到第一个进入结果的结点(右结点最小),然后问题就变成了 以第一个结点的右结点为开始的段落的最大段落数。
注意点
自己写cmp在子类里,会超时
ac代码
c++:
class Solution {
public:
//static bool cmp(vector<int> x,vector<int> y)
//{
// return x[1]<y1[1];
//}
//cmp自己在外面定义函数会超时
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
if(intervals.size()==0||intervals.size()==1)
return 0;
sort(intervals.begin(), intervals.end(), [](const auto& u, const auto& v) {
return u[1] < v[1];
});
int rear = intervals[0][1];
int sum=1;
for(int i=1;i<intervals.size();i++)
{
if(intervals[i][0]>=rear)
{
sum++;
rear=intervals[i][1];
}
}
return intervals.size()-sum;
}
};
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/squares-of-a-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。