區(qū)間調(diào)度之區(qū)間交集問題

讀完本文,你可以去力扣拿下如下題目:

986.區(qū)間列表的交集

-----------

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

先看下題目破花,LeetCode 第 986 題就是這個(gè)問題:

title

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

思路

解決區(qū)間問題的思路一般是先排序狮惜,以便操作高诺,不過題目說已經(jīng)排好序了,那么可以用兩個(gè)索引指針在 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

不難,我們先老老實(shí)實(shí)分析一下各種情況开泽。

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

image

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

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

PS:我認(rèn)真寫了 100 多篇原創(chuàng),手把手刷 200 道力扣題目峦耘,全部發(fā)布在 labuladong的算法小抄剔蹋,持續(xù)更新。建議收藏辅髓,按照我的文章順序刷題泣崩,掌握各種算法套路后投再入題海就如魚得水了。

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

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

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

image

這很簡(jiǎn)單吧而叼,就這四種情況而已。那么接下來思考豹悬,這幾種情況下葵陵,交集是否有什么共同點(diǎn)呢?

image

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

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 肯定要前進(jìn)(遞增)的秤朗,什么時(shí)候應(yīng)該前進(jìn)呢?

image

結(jié)合動(dòng)畫示例就很好理解了笔喉,是否前進(jìn)取视,只取決于 a2b2 的大小關(guān)系:

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

代碼

# A, B 形如 [[0,2],[5,10]...]
def intervalIntersection(A, B):
    i, j = 0, 0 # 雙指針
    res = []
    while i < len(A) and j < len(B):
        a1, a2 = A[i][0], A[i][1]
        b1, b2 = B[j][0], B[j][1]
        # 兩個(gè)區(qū)間存在交集
        if b2 >= a1 and a2 >= b1:
            # 計(jì)算出交集,加入 res
            res.append([max(a1, b1), min(a2, b2)])
        # 指針前進(jìn)
        if b2 < a2: j += 1
        else:       i += 1
    return res

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

另外,區(qū)間問題沒啥特別厲害的奇技淫巧秧倾,其操作也樸實(shí)無華怨酝,但其應(yīng)用卻十分廣泛。

_____________

我的 在線電子書 有 100 篇原創(chuàng)文章那先,手把手帶刷 200 道力扣題目农猬,建議收藏!對(duì)應(yīng)的 GitHub 算法倉庫 已經(jīng)獲得了 70k star售淡,歡迎標(biāo)星斤葱!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市揖闸,隨后出現(xiàn)的幾起案子揍堕,更是在濱河造成了極大的恐慌,老刑警劉巖汤纸,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件衩茸,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡贮泞,警方通過查閱死者的電腦和手機(jī)楞慈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門幔烛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人囊蓝,你說我怎么就攤上這事饿悬。” “怎么了聚霜?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵狡恬,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我俯萎,道長(zhǎng)傲宜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任夫啊,我火速辦了婚禮函卒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘撇眯。我一直安慰自己报嵌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布熊榛。 她就那樣靜靜地躺著锚国,像睡著了一般。 火紅的嫁衣襯著肌膚如雪玄坦。 梳的紋絲不亂的頭發(fā)上血筑,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音煎楣,去河邊找鬼豺总。 笑死,一個(gè)胖子當(dāng)著我的面吹牛择懂,可吹牛的內(nèi)容都是我干的喻喳。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼困曙,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼表伦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起慷丽,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤蹦哼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后要糊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纲熏,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赤套。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡珊膜,死狀恐怖容握,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情车柠,我是刑警寧澤剔氏,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站竹祷,受9級(jí)特大地震影響谈跛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜塑陵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一感憾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧令花,春花似錦阻桅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至扮碧,卻和暖如春趟章,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背慎王。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來泰國打工蚓土, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人柬祠。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓北戏,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親漫蛔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嗜愈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容