久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

用算法優(yōu)雅地求出兩組區(qū)間的交集

 華府九五二七 2019-11-15


本文是區(qū)間系列問題的第三篇,,前兩篇分別講了區(qū)間的最大不相交子集和重疊區(qū)間的合并,,今天再寫一個算法,可以快速找出兩組區(qū)間的交集,。

先看下題目,,LeetCode 第 986 題就是這個問題:

題目很好理解,,就是讓你找交集,注意區(qū)間都是閉區(qū)間,。

思路

解決區(qū)間問題的思路一般是先排序,,以便操作,不過題目說已經(jīng)排好序了,,那么就可以用兩個索引指針在AB中游走,,把交集找出來,代碼大概是這樣的:

# A, B 形如 [[0,2],[5,10]...]
def intervalIntersection(A, B):
    i, j = 0, 0
    res = []
    while i < len(A) and j < len(B):
        # ...
        j += 1
        i += 1
    return res

不難,,我們先老老實實分析一下各種情況,。

首先,對于兩個區(qū)間,,我們用[a1,a2][b1,b2]表示在AB中的兩個區(qū)間,,那么什么情況下這兩個區(qū)間沒有交集呢:

只有這兩種情況,寫成代碼的條件判斷就是這樣:

if b2 < a1 or a2 < b1:
    [a1,a2] 和 [b1,b2] 無交集

那么,,什么情況下,,兩個區(qū)間存在交集呢?根據(jù)命題的否定,,上面邏輯的否命題就是存在交集的條件:

# 不等號取反,or 也要變成 and
if b2 >= a1 and a2 >= b1:
    [a1,a2] 和 [b1,b2] 存在交集

接下來,,兩個區(qū)間存在交集的情況有哪些呢,?窮舉出來:

這很簡單吧,就這四種情況而已,。那么接下來思考,,這幾種情況下,交集是否有什么共同點呢,?

我們驚奇地發(fā)現(xiàn),,交集區(qū)間是有規(guī)律的!如果交集區(qū)間是[c1,c2],,那么c1=max(a1,b1),,c2=min(a2,b2)!這一點就是尋找交集的核心,,我們把代碼更進一步:

while i < len(A) and j < len(B):
    a1, a2 = A[i][0], A[i][1]
    b1, b2 = B[j][0], B[j][1]
    if b2 >= a1 and a2 >= b1:
        res.append([max(a1, b1), min(a2, b2)])
    # ...

最后一步,,我們的指針ij肯定要前進(遞增)的,什么時候應該前進呢,?

結合動畫示例就很好理解了,,是否前進,只取決于a2b2的大小關系:

while i < len(A) and j < len(B):
    # ...
    if b2 < a2:
        j += 1
    else:
        i += 1

代碼

總結一下,,區(qū)間類問題看起來都比較復雜,,情況很多難以處理,,但實際上通過觀察各種不同情況之間的共性可以發(fā)現(xiàn)規(guī)律,用簡潔的代碼就能處理,。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導購買等信息,謹防詐騙,。如發(fā)現(xiàn)有害或侵權內(nèi)容,,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多