2020年5月23日 星期六

Leetcode題解 Python & C#:五月挑戰DAY23 Interval List Intersections

要找出 A 與 B 的區間,因為不一定會按順序交疊,所以用 indexA , indexB 來記錄目前 Traverse 的位置。

如果有交疊,範圍會是從二者的左側取大,右側取小的範圍。

那要怎麼移動 index ? 

如果有一個的右側很大,對方的下一個右側可能還沒超過它。因此,此時應該是要繼續移動右側較小的。

Python
class Solution:
    def intervalIntersection(self, A: List[List[int]], B: List[List[int]]) -> List[List[int]]:
        ia = ib = 0
        na = len(A)
        nb = len(B)
        result = []
        while ia < na and ib < nb:
            if A[ia][1] < B[ib][0] or A[ia][0] > B[ib][1]:
                pass
                #continue
            else:
                l = max(A[ia][0], B[ib][0])
                r = min(A[ia][1], B[ib][1])
                result.append([l, r])
            if A[ia][1] < B[ib][1]:
                ia += 1
            else:
                ib += 1
        return result
C#
public class Solution {
    public int[][] IntervalIntersection(int[][] A, int[][] B) {
        int idxA = 0;
        int idxB = 0;
        var result = new List();
        while(idxA < A.Length && idxB < B.Length)
        {
            int l = Math.Max(A[idxA][0], B[idxB][0]);
            int r = Math.Min(A[idxA][1], B[idxB][1]);
            if(l <= r)
            {
                result.Add(new int[2]{l, r});
            }
            if(A[idxA][1] <= B[idxB][1])
            {
                idxA += 1;
            }
            else
            {
                idxB += 1;
            }
        }
        return result.ToArray();
    }
}