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;
    }

 

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