題目描述:以數組 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(); } } }
【每日寄語】 當你不開心的時候,你就能夠吃一塊糖果,而後告訴本身生活仍是甜甜的,加油。