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();
        }
    }
}
【每日寄語】 當你不開心的時候,你就能夠吃一塊糖果,而後告訴本身生活仍是甜甜的,加油。
相關文章
相關標籤/搜索