leetcode 56題合併區間 PHP解法

2021-10-01 08:32:46 字數 1514 閱讀 8709

題目:

給出乙個區間的集合,請合併所有重疊的區間。

示例 1:

輸入: [

[1,3],[2,6],[8,10],[15,18]

]輸出: [

[1,6],[8,10],[15,18]

]解釋: 區間 [1,3] 和 [2,6] 重疊, 將它們合併為 [1,6].

示例 2:

輸入: [

[1,4],[4,5]

]輸出: [

[1,5]

]解釋: 區間 [1,4] 和 [4,5] 可被視為重疊區間。

首先,我們將列表按上述方式排序。然後,我們將第乙個區間插入 merged 陣列中,然後按順序考慮之後的每個區間:如果當前區間的左端點在前乙個區間的右端點之後,那麼他們不會重合,我們可以直接將這個區間插入 merged 中;否則,他們重合,我們用當前區間的右端點更新前乙個區間的右端點 end 如果前者數值比後者大的話。

乙個簡單的證明:假設演算法在某些情況下沒能合併兩個本應合併的區間,那麼說明存在這樣的三元組 ii,jj 和 kk 以及區間 intsints 滿足 i < j < ki我們聯立這些不等式(注意還有乙個顯然的不等式 ints[j].start \leq ints[j].endints[j].start≤ints[j].end),可以發現衝突:

\begin ints[i].end < ints[j].start \leq ints[j].end < ints[k].start \\ ints[i].end \geq ints[k].start \end

ints[i].end因此,所有能夠合併的區間必然是連續的。

考慮上面的例子,當列表已經排好序,能夠合併的區間構成了連通塊。

上面的解題思路leetcode已經給了出來,下面我們就用php的**去實現它。

class

solution

//公升序排序

asort

($num1);

//獲取排序後的第乙個開始時間

$begin=!

empty

($intervals

[$num1[0

]][0

])?$intervals

[$num1[0

]][0

]:0;

//獲取排序後的第乙個結束時間

$end=!

empty

($intervals

[$num1[0

]][1

])?$intervals

[$num1[0

]][1

]:0;

//比對時間

foreach

($num1

as$key

=>

$value

)else

}array_push

($result,[

$begin

,$end])

;}return

$result;}

}

Leetcode 56 合併區間

對所有區間按起點位置進行排序 遍歷到k點後的 l,r 已知的包含k點的最大區間 遍歷到k 1點,若該起點屬於 l,r 那麼可能擴充套件這個區間的終點,r max r,k 1點的end definition for an interval.struct interval interval int s,...

LeetCode 56 合併區間

給出乙個區間的集合,請合併所有重疊的區間。示例 1 輸入 1,3 2,6 8,10 15,18 輸出 1,6 8,10 15,18 解釋 區間 1,3 和 2,6 重疊,將它們合併為 1,6 示例 2 輸入 1,4 4,5 輸出 1,5 解釋 區間 1,4 和 4,5 可被視為重疊區間。解題思路 1...

LeetCode 56 合併區間

給出乙個區間的集合,請合併所有重疊的區間。示例 1 輸入 1,3 2,6 8,10 15,18 輸出 1,6 8,10 15,18 解釋 區間 1,3 和 2,6 重疊,將它們合併為 1,6 示例 2 輸入 1,4 4,5 輸出 1,5 解釋 區間 1,4 和 4,5 可被視為重疊區間。題意還是好理...