本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一、题目描述:
给你一个 无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
示例 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 <= 10^4
- intervals[i].length == 2
- 0 <= intervals[i][0] <= intervals[i][1] <= 10^5
- intervals 根据 intervals[i][0] 按 升序 排列
- newInterval.length == 2
- 0 <= newInterval[0] <= newInterval[1] <= 10^5
二、思路分析:
其实就按照正常思路做就可以了,先构造一个数组,里面存储各个区间,然后循环遍历,如果要插入的区间与原来的区间没有交集,直接将原来的区间add到数组中,如果有交集,则判断左端点与右端点与新插入区间的关系,左端点永远取最小值,右端点永远取最大值。最后在结果中add最小值与最大值即可。 最后再将结果重新转换为一个数组,并利用compare进行排序就可以了。
三、AC 代码:
class Solution {
public int[][] insert(int[][] intervals, int[] newInterval) {
int n = intervals.length;
//if(n==0) return new int[newInterval][];
List<int[]> inserted = new ArrayList<>();
int L=newInterval[0],R=newInterval[1];
for(int i=0;i<n;i++){
if(intervals[i][1]<L ||intervals[i][0]>R){
inserted.add(intervals[i]);
}else{
L=Math.min(intervals[i][0],L);
R=Math.max(intervals[i][1],R);
}
}
inserted.add(new int[]{L,R});
int[][] result = inserted.toArray(new int[inserted.size()][2]);
Arrays.sort(result,new Comparator<int[]>(){
public int compare(int[] interval1,int[] interval2){
return interval1[0]-interval2[0];
}
});
return result;
}
}
范文参考:
思路不清晰,代码不简单【GO】【二分法】 - 插入区间 - 力扣(LeetCode) (leetcode-cn.com)