LeeCode 986. 區間列表的交集

題目:

給定兩個由一些閉區間組成的列表,每個區間列表都是成對不相交的,並且已經排序。

返回這兩個區間列表的交集。

(形式上,閉區間 [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;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章