给定两个由一些闭区间组成的列表,每个区间列表都是成对不相交的,并且已经排序。
返回这两个区间列表的交集。
(形式上,闭区间 [a, b]
(其中 a <= b
)表示实数 x
的集合,而 a <= x <= b
。两个闭区间的交集是一组实数,要么为空集,要么为闭区间。例如,[1, 3] 和 [2, 4] 的交集为 [2, 3]。)
示例:
输入:A = [[0,2],[5,10],[13,23],[24,25]], B = [[1,5],[8,12],[15,24],[25,26]]
输出:[[1,2],[5,5],[8,10],[15,23],[24,24],[25,25]]
注意:输入和所需的输出都是区间对象组成的列表,而不是数组或列表。
我的思路:
可以借鉴两个有序数组合并时候的思路。对A、B进行遍历,只要有一个遍历完就停止遍历。
遍历过程如下:
①如果A的一个区间的end比B的start要小,说明这个区间一定在前面即不可能与后续的B有交集,因此A往后走。反之如果B的end比A的start小,则B往后走。
②A(B)的start小于等于A(B)的start且A(B)的end大于等于B(A)的start。这种情况一定是有交集的。但还要分两种情况:
a.A(B)是包含在B(A)里面的,也就是A(B)整个的就是交集
b.A(B)与B(A)是交错的。
我的代码:
class Interval {
int start;
int end;
Interval() { start = 0; end = 0; }
Interval(int s, int e) { start = s; end = e; }
}
public class IntervalListIntersections {
public Interval[] intervalIntersection(Interval[] A, Interval[] B) {
ArrayList<Interval> res = new ArrayList<>();
if(A.length == 0 || B.length == 0) {
Interval[] t = new Interval[0];
return t;
}
int i = 0 , j = 0,count = 0;
while (i<A.length && j<B.length) {
if(A[i].end<B[j].start) i++;
else if (B[j].end<A[i].start) j++;
else if (A[i].start<=B[j].start && A[i].end>=B[j].start) {
if(A[i].end<B[j].end) {
Interval tmp = new Interval(B[j].start,A[i].end);
//res[count++] = tmp;
res.add(tmp);
i++;
}else {
Interval tmp = new Interval(B[j].start, B[j].end);
res.add(tmp);
j++;
}
}else if (B[j].start<=A[i].start && B[j].end>=A[i].start) {
if(B[j].end<A[i].end) {
Interval tmp = new Interval(A[i].start,B[j].end);
res.add(tmp);
j++;
}else {
Interval tmp = new Interval(A[i].start,A[i].end);
res.add(tmp);
i++;
}
}
}
Interval[] tIntervals = new Interval[res.size()];
return res.toArray(tIntervals);
}
public static void main(String[] args) {
Interval[] tIntervals = new IntervalListIntersections().intervalIntersection(new Interval[] {
new Interval(0, 2),new Interval(5,10),
new Interval(13,23),new Interval(24, 25)
}, new Interval[] {
new Interval(1, 5),new Interval(8, 12),
new Interval(15, 24),new Interval(25, 26)
});
for(Interval i:tIntervals) {
System.out.println(i.start+" "+i.end);
}
Interval[] tIntervals1 = new IntervalListIntersections().intervalIntersection(new Interval[] {
}, new Interval[] {
});
for(Interval i:tIntervals1) {
System.out.println(i.start+" "+i.end);
}
Interval[] tIntervals3 = new IntervalListIntersections().intervalIntersection(new Interval[] {
new Interval(5, 10)
}, new Interval[] {
new Interval(5, 6)
});
for(Interval i:tIntervals3) {
System.out.println(i.start+" "+i.end);
}
}
}
运行结果: