【LeetCode】數組--合並區間(56)
寫在前面
老粉絲可能知道現階段的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)