問題
原文
You are given two lists of closed intervals,
firstList
andsecondList
, wherefirstList[i] = [starti, endi]
andsecondList[j] = [startj, endj]
. Each list of intervals is pairwise disjoint and in sorted order.Return the intersection of these two interval lists.
A closed interval
[a, b]
(witha <= b
) denotes the set of real numbersx
witha <= x <= b
.The intersection of two closed intervals is a set of real numbers that are either empty or represented as a closed interval. For example, the intersection of
[1, 3]
and[2, 4]
is[2, 3]
.
Example 1:
12 Input: firstList = [[0,2],[5,10],[13,23],[24,25]], secondList = [[1,5],[8,12],[15,24],[25,26]]Output: [[1,2],[5,5],[8,10],[15,23],[24,24],[25,25]]Example 2:
12 Input: firstList = [[1,3],[5,9]], secondList = []Output: []
Constraints:
0 <= firstList.length, secondList.length <= 1000
firstList.length + secondList.length >= 1
0 <= starti < endi <= 109
endi < starti+1
0 <= startj < endj <= 109
endj < startj+1
内容
2つの閉じた区間のリストが与えられます。それぞれのリストは[start, end]として開始~終了までの区間を表します。それぞれの区間は1:1で対応しており、ソートされています。
2つの区間の共通区間を返してください。
閉区間[a,b]は、a<=x<=bである実数xの集合を表します。
2つの閉区間の共通区間は、空であるか、閉区間として表現される実数の集合です。
例えば、[1,3]と[2,4]の共通区間は[2,3]になります。
※正しくない可能性があります。
解答
解答1:Python, two pointer
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
class Solution: def intervalIntersection(self, firstList: List[List[int]], secondList: List[List[int]]) -> List[List[int]]: #2ポインタを使って2つのリストの小さい方を1つずつ増やしつつ、共通部分を戻り値に追加 intersection_list = [] i,j = 0, 0 #i,jは2ポインタ。最後の要素にたどり着くまで繰り返す while i < len(firstList) and j < len(secondList): maximum_start = max(firstList[i][0], secondList[j][0]) minimum_end = min(firstList[i][1], secondList[j][1]) # 0-------2 # 1-------3 #この場合、maximum_start=1,minimum_end=2になる #1~2は共通区間なので、次の操作で解答の1つとして追加される #<共通部分があれば戻り値に追加する> if maximum_start <= minimum_end: intersection_list.append([maximum_start, minimum_end]) #<終わり位置が小さい方のポインタを1つ増やして2つのリストを進める> #firstListの終わり位置がsecondListの終わり位置よりも小さい場合 if firstList[i][1] < secondList[j][1]: #firstListのポインタを増やし、次の要素へ移る i += 1 #firstListの終わり位置がsecondListの終わり位置よりも大きい場合 else: #secondListのポインタを増やし、次の要素へ移る j += 1 #戻り値を返す return intersection_list |
解答2:
メモ・参考・感想
コメント