给定一个无重叠的,按照区间起点升序排列的区间列表,在列表中插入一个新区间,如果有原区间有重合,则合并,请返回插入后的区间列表。
数据范围:区间列表长度满足
, 区间的左右端点满足 
class Solution {
public Interval[] insertInterval (Interval[] intervals, Interval newInterval){
ArrayList<Interval> list = new ArrayList<>();
for (Interval interval : intervals) {
if (newInterval.end < interval.start || newInterval.start > interval.end){
list.add(interval);
}else {
newInterval.start = Math.min(newInterval.start, interval.start);
newInterval.end = Math.max(newInterval.end, interval.end);
}
}
list.add(newInterval);
Interval[] array = list.toArray(new Interval[0]);
Arrays.sort(array, (o1, o2) -> o1.start - o2.start);
return array;
}
} Java解法 不相交区间正在加在返回结果中 相交的区间取[min(L1, L2), max(R1, R2)]即可
import java.util.*;
/*
* public class Interval {
* int start;
* int end;
* public Interval(int start, int end) {
* this.start = start;
* this.end = end;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param Intervals Interval类一维数组
* @param newInterval Interval类
* @return Interval类一维数组
*/
public Interval[] insertInterval (Interval[] Intervals, Interval newInterval) {
// write code here
if(Intervals.length == 0){
return new Interval[]{newInterval};
}
ArrayList<Interval> list = new ArrayList<>();
list.add(newInterval);
for(int i = 0; i < Intervals.length; i++){
list.add(Intervals[i]);
}
// 先对所有区间按起点升序终点也升序进行二次排序,这样可以保证相同起点的区间,更大的区间在后面
Collections.sort(list, (a, b) -> a.start != b.start? a.start - b.start: a.end - b.end);
// 用双端链表构建一个结果集
LinkedList<Interval> linkedlist = new LinkedList<>();
linkedlist.add(list.get(0));
for(int i = 1; i < list.size(); i++){
if(list.get(i).start <= linkedlist.getLast().end){
// 当前区间与最后一个加入的区间有重叠
if(list.get(i).end <= linkedlist.getLast().end){
// 当前区间已经被前面的区间囊括
continue;
}
// 合并区间
list.get(i).start = linkedlist.getLast().start;
linkedlist.removeLast();
linkedlist.add(list.get(i));
}else{
linkedlist.add(list.get(i));
}
}
Interval[] res = new Interval[linkedlist.size()];
Iterator<Interval> iterator = linkedlist.iterator();
int index = 0;
while(iterator.hasNext()){
res[index++] = iterator.next();
}
return res;
}
} import java.util.*;
/*
* public class Interval {
* int start;
* int end;
* public Interval(int start, int end) {
* this.start = start;
* this.end = end;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param Intervals Interval类一维数组
* @param newInterval Interval类
* @return Interval类一维数组
*/
public Interval[] insertInterval (Interval[] Intervals, Interval newInterval) {
// write code here
if(Intervals.length == 0){
return new Interval[]{newInterval};
}
ArrayList<Interval> list = new ArrayList<>();
list.add(newInterval);
for(int i = 0; i < Intervals.length; i++){
list.add(Intervals[i]);
}
// 先对所有区间按起点升序终点也升序进行二次排序,这样可以保证相同起点的区间,更大的区间在后面
Collections.sort(list, (a, b) -> a.start != b.start? a.start - b.start: a.end - b.end);
// 用双端链表构建一个结果集
LinkedList<Interval> linkedlist = new LinkedList<>();
linkedlist.add(list.get(0));
for(int i = 1; i < list.size(); i++){
if(list.get(i).start <= linkedlist.getLast().end){
// 当前区间与最后一个加入的区间有重叠
if(list.get(i).end <= linkedlist.getLast().end){
// 当前区间已经被前面的区间囊括
continue;
}
// 合并区间
list.get(i).start = linkedlist.getLast().start;
linkedlist.removeLast();
linkedlist.add(list.get(i));
}else{
linkedlist.add(list.get(i));
}
}
Interval[] res = new Interval[linkedlist.size()];
Iterator<Interval> iterator = linkedlist.iterator();
int index = 0;
while(iterator.hasNext()){
res[index++] = iterator.next();
}
return res;
}
}