题目
给定两个由一些闭区间组成的列表,每个区间列表都是成对不相交的,并且已经排序。
返回这两个区间列表的交集。
(形式上,闭区间 [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,然后让A数组的start和B数组的start比较取大的,A数组的end和B数组的end比较取小的,如果此时新取的start小于等于end放入新数组中,此时再让A数组的第一个数组和B数组的第2个数组进行比较,如果A数组的第一个数组的end大于等于B数组的第2个数组的start执行上述过程,如果不满足,开始对A数组的第2个数组比较。
代码
class Solution
{
public:
vector<Interval> intervalIntersection(vector<Interval>& A, vector<Interval>& B)
{
int len1 = A.size();
int len2 = B.size();
vector<Interval> answer;
Interval temp;
int index;
int new_start;
int new_end;
if( (len1 == 0) || (len2 == 0))
return answer;
for(int i = 0; i < len1; i++)
{
index = 0;
while( (index < len2) && (A[i].end >= B[index].start)) //index < len2是为了防止越界访问
{
new_start = max(A[i].start,B[index].start);
new_end = min(A[i].end,B[index].end);
if(new_start <= new_end)
{
temp.start = new_start;
temp.end = new_end;
answer.push_back(temp);
}
index++;
}
}
return answer;
}
};