【LeetCode】56 合併區間
阿新 • • 發佈:2018-11-21
給出一個區間的集合,請合併所有重疊的區間。
示例 1:
輸入: [[1,3],[2,6],[8,10],[15,18]]
輸出: [[1,6],[8,10],[15,18]]
解釋: 區間[1,3] 和 [2,6] 重疊, 將它們合併為 [1,6].
示例 2:
輸入: [[1,4],[4,5]]
輸出: [[1,5]]
解釋: 區間 [1,4] 和 [4,5] 可被視為重疊區間。
解題思路
1 比較簡單的思路是對每個區間進行遍歷,將和它重疊的區間合併並刪除相應區間。時間複雜度是O(n^2)。
2 第一種思路情況較多,細枝末節很容易出錯。第二種思路是將起點和終點分別排序,若第n+1個起點大於第n個終點,那麼就可以確定一個合併後的區間。時間複雜度是O(n)。
3 下面給出了兩種思路的實現。
第一種思路:
/** * Definition for an interval. * public class Interval { * int start; * int end; * Interval() { start = 0; end = 0; } * Interval(int s, int e) { start = s; end = e; } * } */ class Solution { public List<Interval> merge(List<Interval> intervals) { int i = 0; while (i < intervals.size()){ Interval i1 = intervals.get(i); boolean flag = false; int j = 0; while (j < intervals.size()){ if(j == i){ j++; continue; } Interval i2 = intervals.get(j); if (i1.start == i2.start){ if (i1.end < i2.end){ i1.end = i2.end; intervals.set(i,i1); flag = true; } intervals.remove(j); j--; } else if (i1.start < i2.start){ if (i1.end >= i2.end){ intervals.remove(j); j--; } else if (i1.end >= i2.start){ i1.end = i2.end; intervals.set(i,i1); flag = true; intervals.remove(j); j--; } } else if (i1.start > i2.start){ if (i2.end >= i1.end){ i1.start = i2.start; i1.end = i2.end; intervals.set(i,i1); flag = true; intervals.remove(j); j--; } else if (i2.end >= i1.start){ i1.start = i2.start; intervals.set(i,i1); flag = true; intervals.remove(j); j--; } } j++; } if (!flag) i++; } return intervals; } }
第二種思路:
/** * Definition for an interval. * public class Interval { * int start; * int end; * Interval() { start = 0; end = 0; } * Interval(int s, int e) { start = s; end = e; } * } */ class Solution { public List<Interval> merge(List<Interval> intervals) { int size = intervals.size(); int[] starts = new int[size]; int[] ends = new int[size]; List<Interval> result = new ArrayList<>(); for (int i = 0;i < size;i++){ starts[i] = intervals.get(i).start; ends[i] = intervals.get(i).end; } Arrays.sort(starts); Arrays.sort(ends); for (int i = 0, j = 0;i < size;i++){ if (i == size - 1||starts[i+1] > ends[i]){ result.add(new Interval(starts[j], ends[i])); j = i+1; } } return result; } }