56. Insert Interval & Merge Intervals
Insert Intervals
Given a non-overlapping interval list which is sorted by start point.
Insert a new interval into it, make sure the list is still in order and non-overlapping (merge intervals if necessary).
Example
Insert [2, 5] into [[1,2], [5,9]], we get [[1,9]].
Insert [3, 4] into [[1,2], [5,9]], we get [[1,2], [3,4], [5,9]].
分析:
Create a new array list, insert the smaller interval in the new array and use a counter to keep track of the total number of smaller intervals. If we find an interval overlapping with the new one, we need to change the start and end.
1 class Solution { 2 public int[][] insert(int[][] intervals, int[] newInterval) { 3 List<int[]> resultList = new ArrayList<>(); 4 boolean hasInserted = false; 5 for (int[] interval : intervals) { 6 if (interval[0] > newInterval[1]) { 7 if (!hasInserted) { 8 resultList.add(newInterval); 9 hasInserted = true; 10 } 11 resultList.add(interval); 12 } else if (interval[1] < newInterval[0]) { 13 resultList.add(interval); 14 } else { 15 newInterval[0] = Math.min(newInterval[0], interval[0]); 16 newInterval[1] = Math.max(newInterval[1], interval[1]); 17 } 18 } 19 20 if (!hasInserted) { 21 resultList.add(newInterval); 22 } 23 24 return resultList.toArray(new int[0][0]); 25 } 26 }
Python Version
1 class Solution: 2 def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]: 3 result = [] 4 hasInserted = False 5 6 for interval in intervals: 7 if hasInserted: 8 result.append(interval) 9 # interval completely before newInterval 10 elif interval[1] < newInterval[0]: 11 result.append(interval) 12 13 # interval completely after newInterval 14 elif interval[0] > newInterval[1]: 15 result.append(newInterval) 16 result.append(interval) 17 hasInserted = True 18 19 # overlapping intervals 20 else: 21 newInterval[0] = min(newInterval[0], interval[0]) 22 newInterval[1] = max(newInterval[1], interval[1]) 23 if not hasInserted: 24 result.append(newInterval) 25 return result
Merge Intervals
Given a collection of intervals, merge all overlapping intervals.
Example
Given intervals => merged intervals:
[ [
[1, 3], [1, 6],
[2, 6], => [8, 10],
[8, 10], [15, 18]
[15, 18] ]
]
Analyze:
Sort first, then merge intervals if they overlap.
1 class Solution { 2 public int[][] merge(int[][] intervals) { 3 Arrays.sort(intervals, (a, b) -> a[0] - b[0]); 4 5 List<int[]> merged = new ArrayList<>(); 6 merged.add(intervals[0]); 7 8 for (int i = 1; i < intervals.length; i++) { 9 int[] prev = merged.get(merged.size() - 1); 10 int[] interval = intervals[i]; 11 if (interval[0] <= prev[1]) { 12 prev[1] = Math.max(prev[1], interval[1]); 13 } else { 14 merged.add(interval); 15 } 16 } 17 return merged.toArray(new int[0][0]); 18 } 19 }
Python Version
1 class Solution: 2 def merge(self, intervals: List[List[int]]) -> List[List[int]]: 3 intervals.sort(key=lambda x: x[0]) 4 ret = [intervals[0]] 5 for start, end in intervals[1:]: 6 if start <= ret[-1][1]: 7 ret[-1][1] = max(end, ret[-1][1]) 8 else: 9 ret.append([start, end]) 10 return ret

浙公网安备 33010602011771号