Leetcode435. 无重叠区间

Every day a leetcode

题目来源:435. 无重叠区间

解法1:贪心

求最少的移除区间个数,等价于尽量多保留不重叠的区间。

在选择要保留区间时,区间的结尾十分重要:选择的区间结尾越小,余留给其它区间的空间就越大,就越能保留更多的区间。

所以我们采取的贪心策略为:优先保留结尾小且不相交的区间。

具体实现方法为:先把区间按照结尾的大小进行增序排序,每次选择结尾最小且和前一个选择的区间不重叠的区间。

代码:

int cmpfunc(const int **a, const int **b)
{
    return ((*a)[1] - (*b)[1]);
}

int eraseOverlapIntervals(int **intervals, int intervalsSize, int *intervalsColSize)
{
    int n = intervalsSize;
    if (n == 0)
        return 0;
    qsort(intervals, n, sizeof(int *), cmpfunc);
    int pre = intervals[0][1];
    int removed = 0;
    for (int i = 1; i < n; i++)
    {
        if (intervals[i][0] < pre)
            removed++;
        else
            pre = intervals[i][1];
    }
    return removed;
}

结果:

Leetcode435. 无重叠区间_第1张图片

复杂度分析:

Leetcode435. 无重叠区间_第2张图片

你可能感兴趣的:(Every,day,a,leetcode,Leetcode)