題目:
給定兩個由一些閉區間組成的列表,每個區間列表都是成對不相交的,並且已經排序。
返回這兩個區間列表的交集。
(形式上,閉區間 [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]]
注意:輸入和所需的輸出都是區間對象組成的列表,而不是數組或列表。
提示:
0 <= A.length < 1000
0 <= B.length < 1000
0 <= A[i].start, A[i].end, B[i].start, B[i].end < 10^9
解題思路:
1.循環A數組,再將每個B數組中的元素和A中元素相較,判斷是否有交集:
以A = [[0,2],[5,10],[13,23],[24,25]], B = [[1,5],[8,12],[15,24],[25,26]]爲例,循環A數組,第一個元素爲[0, 2],我們設as=0,ae=2,
B的第一個元素爲[1, 5],我們設bs=1, be=5
判斷是否有交集的方法:如果bs > ae 或者 as > be,則兩個區間沒有交集,否則,則有交集。
2.考慮性能:
循環A數組時,內層需要循環B數組,但B數組不需要每次都從第一個元素開始循環,因爲我們知道A,B數組中的區間元素是有序的,所以爲了效率考慮,之前參加過區間排序的B數組就不需要再次判斷了。
那麼,如何判斷B數組中的元素是否完全參與了區間排序呢?還是以1中的元素舉例,A[0]=[0, 2], B[0]=[1, 5],則二者的交集是join[0]=[1, 2],此時join[0][1]=2 < B[0][1]=5,證明B的第一個元素還沒有完全參與區間合併,所以A[1]需要繼續和B[0]合併交集,否則不需要。
上代碼:
@Test
public void test() {
// String str = "A = [[0,2],[5,10],[13,23],[24,25]], B = [[1,5],[8,12],[15,24],[25,26]]";
// str = str.replaceAll("\\[", "{");
// str = str.replaceAll("\\]", "}");
// System.out.println(str);
int[][] A = {{0,2},{5,10},{13,23},{24,25}}, B = {{1,5},{8,12},{15,24},{25,26}};
int[][] region = findRegion(A, B);
for (int i = 0; i < region.length; i++) {
System.out.println(Arrays.toString(region[i]));
}
}
public int[][] findRegion(int[][] A, int[][] B) {
int bStart = 0;
List<int[]> resultList = new ArrayList<>();
outer:for (int i = 0; i < A.length; i++) {
int as = A[i][0];
int ae = A[i][1];
for (int j = bStart; j < B.length; j++) {
int bs = B[j][0];
int be = B[j][1];
// B最小比A最大 還大,則continue
if (bs > ae ) {
continue outer;
}
// B最大比A最小還小,則continue
if (be < as) {
bStart++;
continue;
}
// 有交集
int joinS = bs >= as ? bs : as;
int joinE = be <= ae ? be : ae;
if (joinE == be) {
// B數組該元素已經取並集完畢
bStart++;
}
resultList.add(new int[]{joinS, joinE});
}
}
final int[][] resultArray = new int[resultList.size()][2];
for (int i = 0; i < resultList.size(); i++) {
resultArray[i] = resultList.get(i);
}
return resultArray;
}