一次遍历
这题的关键是判断两个区间是否存在交集,比如区间
S
1
[
l
1
,
r
1
]
,
S
2
[
l
2
,
r
2
]
;
如
果
r
1
<
l
2
说
明
S
1
在
S
2
左
侧
无
交
集
,
如
果
l
1
>
r
2
则
说
明
S
1
>
S
2
则
S
1
在
S
2
右
侧
无
交
集
,
如
果
不
符
合
以
上
两
个
条
件
则
说
明
有
交
集
,
S_1[l_1,r_1],S_2[l_2, r_2];如果r_1<l_2说明S_1在S_2左侧无交集,如果l_1>r_2则说明S_1>S_2则S_1在S_2右侧无交集,如果不符合以上两个条件则说明有交集,
S1[l1,r1],S2[l2,r2];如果r1<l2说明S1在S2左侧无交集,如果l1>r2则说明S1>S2则S1在S2右侧无交集,如果不符合以上两个条件则说明有交集,则可以通过
[
m
a
x
(
l
1
,
l
2
)
,
m
i
n
(
r
1
,
r
2
)
]
[max(l_1,l_2),min(r_1,r_2)]
[max(l1,l2),min(r1,r2)]求交集,通过
[
m
i
n
(
l
1
,
l
2
)
,
m
a
x
(
r
1
,
r
2
)
]
[min(l_1,l_2),max(r_1,r_2)]
[min(l1,l2),max(r1,r2)]求并集。
通过遍历区间数组如果当前区间与新区间S无交集则直接加入答案,如果有交集则与新区间S进行合并,如果第一次遇到在S右侧(
l
>
l
e
f
t
l>left
l>left)的区间则将S加入答案,然后加入当前区间,遍历完数组后如果不存在这样的区间则需要把S加入答案。
class Solution {
public int[][] insert(int[][] intervals, int[] newInterval) {
// newInterval 区间的左右下标
int left = newInterval[0];
int right = newInterval[1];
// 存放答案的列表
List<int[]> ans = new ArrayList<>();
// bool 变量 判断是否加入S
boolean placed = false;
// 遍历原来的区间数组
for (int[] interval : intervals) {
// 在插入区间右侧无交集
if (interval[0] > right) {
// 如果没有加入S
if (!placed) {
ans.add(new int[]{left, right});
placed = true;
}
ans.add(interval);
} else if (interval[1] < left) {
// 在插入区间左侧且无交集
ans.add(interval);
} else {
// 与插入区间有交集 计算并集
left = Math.min(left, interval[0]);
right = Math.max(right, interval[1]);
}
}
// 如果不存在这样的区间则将s加入答案
if (!placed) {
ans.add(new int[]{left, right});
}
int[][] fans = new int[ans.size()][2];
for (int i = 0; i < ans.size(); i++) {
fans[i] = ans.get(i);
}
return fans;
}
}