LeetCode-056-合并区间

合并区间

题目描述:以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [start~i~, end~i~] 。请你合并全部重叠的区间,并返回一个不重叠的区间数组,该数组需刚好覆盖输入中的全部区间。java

示例说明请见LeetCode官网。segmentfault

来源:力扣(LeetCode)
连接:https://leetcode-cn.com/probl...
著做权归领扣网络全部。商业转载请联系官方受权,非商业转载请注明出处。数组

解法一:递归

递归的过程以下:网络

  • 若是intervals为空或者intervals只有一个元素即只有1个区间,不须要合并处理,直接返回intervals;
  • 若是intervals不止有1个元素,声明一个变量length记录intervals一维的长度(即有多少个区间),变量match记录不须要合并的区间的数量,matchFirst和matchSecond记录当前须要匹配的区间的2个数,而后再声明一个boolean数组flag记录区间是否已经被合并,而后用双重循环来判断那些区间是能够合并的,处理过程以下:url

    • 外层循环i是第一个区间开始,matchFirst和matchSecond记录i对应区间的2个值而且match加1;
    • 内层循环j从第i+1个区间开始,curFirst和curSecond记录j对应区间的2个值,而后用matchFirst、matchSecond、curFirst、curSecond来判断i和j这2个区间是否有交集,若是有交集,则更新i区间的2个数,并更新matchFirst和matchSecond,而且将j的区间标记为true即已被合并;若是没有交集,则处理下一个;
  • 双重循环处理完后,判断match和length是否相等,若是相等,说明没有可合并的区间,返回intervals;若是不相等,则初始化一个新的二维数组newIntervals,将intervals中没有被合并的区间(根据flag数组判断是否已被合并)拷贝到newIntervals,而后递归调用merge(newIntervals)
public class LeetCode_056 {
    public static int[][] merge(int[][] intervals) {
        if (intervals == null || intervals.length == 1) {
            return intervals;
        }
        int length = intervals.length, match = 0, matchFirst, matchSecond;
        boolean[] flag = new boolean[length];

        for (int i = 0; i < length; i++) {
            if (!flag[i]) {
                matchFirst = intervals[i][0];
                matchSecond = intervals[i][1];
                match++;
                for (int j = i + 1; j < length && !flag[j]; j++) {
                    int curFirst = intervals[j][0], curSecond = intervals[j][1];
                    if (((matchFirst >= curFirst && matchFirst <= curSecond) || (matchSecond >= curFirst && matchSecond <= curSecond)) ||
                            ((curFirst >= matchFirst && curFirst <= matchSecond) || (curSecond >= matchFirst && curSecond <= matchSecond))) {
                        // 有交集
                        matchFirst = Math.min(matchFirst, curFirst);
                        matchSecond = Math.max(matchSecond, curSecond);
                        intervals[i][0] = matchFirst;
                        intervals[i][1] = matchSecond;
                        flag[j] = true;
                    }
                }
            }
        }
        if (match == length) {
            return intervals;
        }
        int[][] newIntervals = new int[match][2];
        for (int i = 0, j = 0; i < length; i++) {
            if (!flag[i]) {
                newIntervals[j] = intervals[i];
                j++;
            }
        }
        return merge(newIntervals);
    }
    
    public static void main(String[] args) {
        int[][] intervals = new int[][]{{1, 4}, {2, 3}};
        for (int[] ints : merge(intervals)) {
            for (int anInt : ints) {
                System.out.print(anInt + " ");
            }
            System.out.println();
        }
    }
}
【每日寄语】 当你不开心的时候,你就能够吃一块糖果,而后告诉本身生活仍是甜甜的,加油。
相关文章
相关标签/搜索