LeetCode解题 57:Insert Interval
Problem 57: Insert Interval [Hard]
Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).
You may assume that the intervals were initially sorted according to their start times.
Example 1:
Input: intervals = [[1,3],[6,9]], newInterval = [2,5]
Output: [[1,5],[6,9]]
Example 2:
Input: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
Output: [[1,2],[3,10],[12,16]]
Explanation: Because the new interval [4,8] overlaps with [3,5],[6,7],[8,10].
NOTE: input types have been changed on April 15, 2019. Please reset to default code definition to get new method signature.
来源:LeetCode
解题思路
- 原区间列表数量为0时,直接返回
newInterval
。 - 遍历区间,分三种情况:
a. 假如当前区间全部在newInterval
之前(interval[i][1] < newInterval[0]
),则直接加入result;
b. 假如当前区间全部在newInterval
之后(inteval[i][0] > newInterval[1]
),分两种情况,一是newInterval
已加入,则直接将当前区间加入result,二是还未加入,则先将newInterval
加入result,再将当前区间加入;
c. 假如当前区间与newInterval
有重叠,则循环遍历至没有重叠,在循环中取 s t a r t = min ( i n t e r v a l [ i ] [ 0 ] , n e w I n t e r v a l [ 0 ] ) start = \min(interval[i][0], newInterval[0]) start=min(interval[i][0],newInterval[0]), e n d = max ( i n t e r v a l [ i ] [ 1 ] , n e w I n t e r v a l [ 1 ] ) end = \max(interval[i][1], newInterval[1]) end=max(interval[i][1],newInterval[1]),最后将区间[start, end]加入result。
整个算法只遍历一次数组,时间复杂度为 O ( n ) O(n) O(n)。
Solution (Java)
class Solution {
public int[][] insert(int[][] intervals, int[] newInterval) {
int m = intervals.length;
if(m == 0) return new int[][] {newInterval};
List<int[]> result = new ArrayList<>();
boolean insert = false;
for(int i = 0; i < m; i++){
if(intervals[i][1] < newInterval[0] || intervals[i][0] > newInterval[1] && insert){
result.add(intervals[i]);
}
else if(intervals[i][0] > newInterval[1] && !insert){
result.add(newInterval);
result.add(intervals[i]);
insert = true;
}
else{
int start = Math.min(intervals[i][0], newInterval[0]);
int end = Math.max(intervals[i][1], newInterval[1]);
int j = i+1;
for(; j < m; j++){
if(intervals[j][0] <= end){
end = Math.max(end, intervals[j][1]);
}
else break;
}
result.add(new int[] {start, end});
insert = true;
i = j-1;
}
}
if(!insert){
result.add(newInterval);
}
return result.toArray(new int[result.size()][2]);
}
}