Non-overlapping Intervals

原题链接: https://leetcode.com/problems/non-overlapping-intervals/description/

题目: Given a collection of intervals, find the minimum number of intervals you need to remove to make the rest of the intervals non-overlapping.

Note:
You may assume the interval’s end point is always bigger than its start point.
Intervals like [1,2] and [2,3] have borders “touching” but they don’t overlap each other.

Solution: 题目给了我们一组区间,让我们求至少需要移除多少个区间,才能使余下的区间没有重叠。那么我们首先给这些区间排序,按照每个区间的结束时间end来排序,越早结束的排在前面。然后,我们可以采用贪心的策略,当我们发现一个区间和另一个区间重叠时,我们总是选择结束时间更早的那个区间,而移除结束时间更晚的那个区间,这样使得剩余的时间更多,可以选择更多的区间。

/**
 * Definition for an interval.
 * struct Interval {
 *     int start;
 *     int end;
 *     Interval() : start(0), end(0) {}
 *     Interval(int s, int e) : start(s), end(e) {}
 * };
 */
class Solution {
public:
    static bool comp(Interval a, Interval b) {
        return a.end < b.end;
    }

    int eraseOverlapIntervals(vector<Interval>& intervals) {
        if (intervals.empty()) return 0;

        sort(intervals.begin(), intervals.end(), comp);

        int needToRemove = 0;
        int curEnd = intervals[0].end;

        for (int i = 1; i < intervals.size(); i++) {
            if (intervals[i].start < curEnd) {
                needToRemove++;
            } else {
                curEnd = intervals[i].end;
            }
        }

        return needToRemove;
    }
};

猜你喜欢

转载自blog.csdn.net/devin_xue/article/details/78996925
今日推荐