贪心热门问题9:合并区间

Posted 纵横千里,捭阖四方

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了贪心热门问题9:合并区间相关的知识,希望对你有一定的参考价值。

LeetCode56.以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。

示例1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

这个题与前面的区间问题一样,按照左边界还是右边界排序都可以,这里按照左边界排序,排序之后局部最优:每次合并都取最大的右边界,这样就可以合并更多的区间了,整体最优:合并所有重叠的区间。

按照左边界从小到大排序之后,如果 intervals[i]的左边界在intervals[i - 1]左边界和右边界的范围内,那么一定有重复!。如果按照左边界从小到大排序之后,如果 intervals[i][0] < intervals[i - 1][1] 即intervals[i]左边界 < intervals[i - 1]右边界,则一定有重复,因为intervals[i]的左边界一定是大于等于intervals[i - 1]的左边界。画图就是如下:

合并了,如何去模拟合并区间呢?用合并区间后左边界和右边界,作为一个新的区间,加入到result数组里就可以了。如果没有合并就把原区间加入到result数组。

public int[][] merge(int[][] intervals) 
        List<int[]> res = new LinkedList<>();
        Arrays.sort(intervals, (o1, o2) -> Integer.compare(o1[0], o2[0]));

        int start = intervals[0][0];
        for (int i = 1; i < intervals.length; i++) 
            if (intervals[i][0] > intervals[i - 1][1]) 
                res.add(new int[]start, intervals[i - 1][1]);
                start = intervals[i][0];
             else 
                intervals[i][1] = Math.max(intervals[i][1], intervals[i - 1][1]);
            
        
        res.add(new int[]start, intervals[intervals.length - 1][1]);
        return res.toArray(new int[res.size()][]);
    

以上是关于贪心热门问题9:合并区间的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode-贪心插入区间

leetcode605. 种花问题贪心策略,局部区间最优解法

贪心热门问题8:划分字母区间

803. 区间合并(贪心)

leetcode 605. 种花问题贪心策略,局部区间最优解法

leetcode 605. 种花问题贪心策略,局部区间最优解法