0986. Interval List Intersections - chasel2361/leetcode GitHub Wiki

Given two lists of closed intervals, each list of intervals is pairwise disjoint and in sorted order.
Return the intersection of these two interval lists.
(Formally, a closed interval [a, b] (with a <= b) denotes the set of real numbers x with a <= x <= b.
The intersection of two closed intervals is a set of real numbers that is either empty, or can be represented as a closed interval.
For example, the intersection of [1, 3] and [2, 4] is [2, 3].)

https://assets.leetcode.com/uploads/2019/01/30/interval1.png

Example 1:
Input:
A = [ [0,2],[5,10],[13,23],[24,25] ],
B = [ [1,5],[8,12],[15,24],[25,26] ]
Output: [ [1,2],[5,5],[8,10],[15,23],[24,24],[25,25] ]
Reminder: The inputs and the desired output are lists of Interval objects, and not arrays or lists.

Note:
0 <= A.length < 1000
0 <= B.length < 1000
0 <= A[i].start, A[i].end, B[i].start, B[i].end < 10^9
NOTE: input types have been changed on April 15, 2019. Please reset to default code definition to get new method signature.

這一題要求在兩個陣列組間尋找交點,有條理的方法是將陣列組逐一取出,取下限的大值與上限的小值,若下限 <= 上限表示有相交,最後比較上限,上限較小的陣列組往前推進。

[1] 若指標 A, B 其中之一超出範圍就不用找了,絕對不會相交
[2] 下限大值 < 上限小值表示有相交
[3] 上限較小者將指標往前走

class Solution:
    def intervalIntersection(self, A, B):
        intersection = []
        i, j = 0, 0        
        while i < len(A) and j < len(B):  #[1]
            low = max(A[i][0], B[j][0])
            high = min(A[i][1], B[j][1])
        
            if low <= high:  #[2]
                intersection.append([low, high])        
            if A[i][1] < B[j][1]:  #[3]
                i += 1
            else:
                j += 1        
        return intersection

這樣寫的時間複雜度為 O(M+N),空間複雜度為 O(M+N)