LeetCode 无重叠区间(贪心策略)

给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。

注意:

可以认为区间的终点总是大于它的起点。
区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。

示例 1:

输入: [ [1,2], [2,3], [3,4], [1,3] ]
输出: 1
解释: 移除 [1,3] 后,剩下的区间没有重叠。

示例 2:

输入: [ [1,2], [1,2], [1,2] ]
输出: 2
解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。

示例 3:

输入: [ [1,2], [2,3] ]
输出: 0
解释: 你不需要移除任何区间,因为它们已经是无重叠的了。

思路分析:首先按照end主,start辅进行升序排序,然后从前往后遍历区间,如果重叠了,则保存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 myCmpOne(Interval &one, Interval &two){
        //以end为主次序递增
        if (one.end == two.end){//当end相等的时候,才进行比较start
            return one.start < two.start;
        }
        else {//否则直接比较end的大小关系
            return one.end < two.end;
        }
    }
    int eraseOverlapIntervals(vector& intervals) {
        if (intervals.empty()){
            return 0;
        }
        sort(intervals.begin(), intervals.end(), myCmpOne);//按照end主,start辅进行升序排序
        int preEnd = intervals[0].end, result = 0;//第一个区间保留
        for (auto it = intervals.begin() + 1; it != intervals.end(); ++it){
            if (it->start < preEnd){//出现了重叠,需要删除
                result += 1;
            }
            else{//否则更新上一个保留的区间尾端
                preEnd = it->end;
            }
        }
        return result;
    }
};

LeetCode 无重叠区间(贪心策略)_第1张图片

你可能感兴趣的:(LeetCode)