区间列表的交集计算

给定两个由一些闭区间组成的列表,每个区间列表都是成对不相交的,并且已经排序。

返回这两个区间列表的交集。

(形式上,闭区间 [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);
		}
	}
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值