1. 程式人生 > >【LeetCode】數組--合並區間(56)

【LeetCode】數組--合並區間(56)

lis end splay pla for 報錯 lag blank .so

寫在前面

老粉絲可能知道現階段的LeetCode刷題將按照某一個特定的專題進行,之前的【貪心算法】已經結束,雖然只有三個題卻包含了簡單,中等,困難這三個維度,今天介紹的是第二個專題【數組】

數組(Array)是一種線性表數據結構。它用一組連續的內存空間,來存儲一組具有相同類型的數據。在每一種編程語言中,基本都會有數組這種數據類型。不過,它不僅僅是一種編程語言中的數據類型,還是一種最基礎的數據結構。

貪心算法回顧:

【LeetCode】貪心算法--買賣股票的最佳時機II(122)

【LeetCode】貪心算法--劃分字母區間(763)

【LeetCode】貪心算法--分發糖果(135)

刷題匯總:

【LeetCode】匯總貼(NO.1-20)

今日題目

給出一個區間的集合,請合並所有重疊區間。

示例 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] 可被視為重疊區間

題目分析

先將目標區間數組從小到大排序,然後從第一個區間開始,如果相鄰的兩個區間,end小於start則合並區間,且生成新的區間,如果不小於,則放到返回區間,可以看下面幾個例子。

[1,3][2,6] ->[1,6]

第一個區間的end大於等於第二個區間的start,同時第二個區間的end大於第一個區間的end。

[2,8][3,5] ->[2,8]

第一個區間的end大於等於第二個區間的start,同時第二個區間的end小於第一個區間的end。

[1,2][3,4] -> [1,2][3,4]

第一個區間的end小於第二個區間的start 。

代碼實現

 1class Solution:
2 def merge(self, intervals):
3 """
4 :type intervals: List[Interval]
5 :rtype: List[Interval]
6 """
7 intervals.sort(key = lambda interval_tmp: interval_tmp.start)
8 N = len(intervals)
9 s = []
10 for i in range(N):
11 flag = 0
12 for j in range(len(s)):
13 if not (intervals[i].start > s[j].end or intervals[i].end < s[j].start):
14 s[j].start = min(intervals[i].start, s[j].start)
15 s[j].end = max(intervals[i].end, s[j].end)
16 flag = 1
17 break
18 if flag == 0:
19 s.append(intervals[i])
20 return s


一切低效率的PASS都是耍流氓,今天拒絕耍流氓。

技術分享圖片

【推薦閱讀】

【LeetCode】貪心算法--劃分字母區間(763)

python異常報錯詳解

機器學習實戰--住房月租金預測(3)

【LeetCode】數組--合並區間(56)