Leetcode 435. Non-overlapping Intervals
Given a collection of intervals, find the minimum number of intervals you need to remove to make the rest of the intervals non-overlapping.
Example 1:
Input: [[1,2],[2,3],[3,4],[1,3]]
Output: 1
Example 2:
Input: [[1,2],[1,2],[1,2]]
Output: 2
Example 3:
Input: [[1,2],[2,3]]
Output: 0
Note:
1.You may assume the interval’s end point is always bigger than its start point.
2.Intervals like [1,2] and [2,3] have borders “touching” but they don’t overlap each other.
题目大意:
给定含有若干个区间的数组,目标是去除其中尽可能少的区间数量使剩下的区间不重叠,边界重叠不算重叠。
解题思路:
首先对区间进行从小到大排序,如果后一个区间的左边界比前一个区间的右边界大则说明重叠,必须去掉一个。在这里采用贪心策略,去掉右边界大的,以确保现有区间长度最短。设置一个指针cur来标记遍历时的右边界,在以下两种情况下要更新cur:1.出现重叠而去掉右边界较大的区间时,更新为较小那个的右边界。2.当前区间的左边界大于等于cur时,更新为当前区间的右边界。时间复杂度为O(nlogn).
代码:
class Solution {
public:
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
if(intervals.size() <= 1)
return 0;
sort(intervals.begin(), intervals.end());
int cur = intervals[0][1], num = 0;
for(int i = 1; i < intervals.size(); i++)
{
if(intervals[i][0] >= cur)
cur = intervals[i][1];
else
{
num++;
cur = min(cur, intervals[i][1]);
}
}
return num;
}
};
本文介绍了解决LeetCode上编号为435的题目——Non-overlapping Intervals的方法。该题旨在寻找最少需要移除的区间数量,以确保剩余区间互不重叠。文章详细阐述了通过排序和贪心策略解决此问题的算法,并提供了C++实现代码。
486

被折叠的 条评论
为什么被折叠?



