给你一个 无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
示例 1:
输入:intervals = [[1,3],[6,9]], newInterval = [2,5]
输出:[[1,5],[6,9]]示例2:
输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
输出:[[1,2],[3,10],[12,16]]
解释:这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。示例 3:
输入:intervals = [], newInterval = [5,7]
输出:[[5,7]]示例 4:
输入:intervals = [[1,5]], newInterval = [2,3]
输出:[[1,5]]示例 5:
输入:intervals = [[1,5]], newInterval = [2,7]
输出:[[1,7]]提示:
- 0 <= intervals.length <= 104
- intervals[i].length == 2
- 0 <=intervals[i][0] <= intervals[i][1] <= 105
- intervals 根据 intervals[i][0] 按 升序 排列
- newInterval.length == 2
- 0 <= newInterval[0] <= newInterval[1] <= 105
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/insert-interval
class Solution {
public int[][] insert(int[][] intervals, int[] newInterval) {
if( intervals .length == 0 ) return new int[][] { newInterval } ;
if( newInterval.length == 0 ) return intervals ;
List<int[]> list = new ArrayList<>() ;
boolean flag = false ;
if( intervals[ 0 ] [ 0 ] > newInterval[ 1 ] && intervals[ 0 ] [ 0 ] > newInterval[ 0 ] )list.add( newInterval ) ;
for(int i = 0 ; i < intervals.length ; i ++) {
if( !flag && i> 0 && intervals[ i ] [ 0 ] > newInterval[ 1 ] && intervals[ i -1 ] [ 1 ] < newInterval[ 0 ] ) {
list.add( newInterval ) ;
}
if( intervals[ i ] [ 1 ] >= newInterval[ 0 ] && intervals[ i ] [ 0 ] <= newInterval[ 1 ]){
newInterval[ 0 ] = newInterval[ 0 ] < intervals[ i ] [ 0 ] ? newInterval[ 0 ] : intervals[ i ] [ 0 ] ;
newInterval[ 1 ] = newInterval[ 1 ] > intervals[ i ] [ 1 ] ? newInterval[ 1 ] : intervals[ i ] [ 1 ] ;
flag = true ;
}else{
if(flag && intervals [ i ][ 0 ] > newInterval [ 1 ]){
list.add( newInterval ) ;
flag = !flag ;
list.add( intervals [ i ] ) ;
}else if(flag && intervals [ i ][ 1 ] < newInterval [ 0 ]){
list.add( intervals [ i ] ) ;
list.add( newInterval ) ;
flag = !flag ;
}else{
list.add( intervals [ i ] ) ;
}
}
}
if( ( intervals[ intervals.length - 1 ] [ 1 ] < newInterval[ 1 ] && intervals[ intervals.length - 1 ] [ 0 ] < newInterval[ 0 ] ) || flag ) list.add( newInterval ) ;
int[][] res = new int[ list .size() ][ 2 ] ;
for( int i = 0 ; i < list.size() ; i ++ ) res[ i ] = list.get ( i ) ;
return res;
}
}
上一个代码太乱了,整理了一下,效率不变
class Solution {
public int[][] insert(int[][] intervals, int[] newInterval) {
if( intervals .length == 0 ) return new int[][] { newInterval } ;
if( newInterval.length == 0 ) return intervals ;
List<int[]> list = new ArrayList<>() ;
boolean flag = true ;
for(int i = 0 ; i < intervals.length ; i ++) {
if( flag ){
if( intervals[ i ][ 0 ] > newInterval[ 1 ] && intervals[ i ][ 0 ] > newInterval[ 0 ]){
list.add( newInterval ) ;
flag = false ;
list.add( intervals[ i ] ) ;
continue ;
}
if(intervals [ i ] [ 1 ] < newInterval [ 0 ] ) list.add( intervals[i]);
else if(intervals [ i ] [ 0 ] <= newInterval [ 1 ]){
newInterval [ 0 ] = Math.min ( newInterval [ 0 ] , intervals [ i ] [ 0 ] );
newInterval [ 1 ] = Math.max ( newInterval [ 1 ] , intervals [ i ] [ 1 ] );
}else{
list.add( newInterval ) ;
flag = false ;
list.add( intervals[ i ] ) ;
}
}else list.add( intervals[ i ] ) ;
}
if( flag ) list.add( newInterval ) ;
int[][] res = new int[ list .size() ][ ] ;
for( int i = 0 ; i < list.size() ; i ++ ) res[ i ] = list.get ( i ) ;
return res;
}
}