1. 程式人生 > 其它 >leetcode(python)——56合併區間,57插入區間

leetcode(python)——56合併區間,57插入區間

技術標籤:LeetCode刷題

題號56

考慮兩個問題:
1.怎麼判斷有沒有重疊?令前面的是p,後面的是q,觀察p的結束結點和q的開始結點即可
區間有重疊,需要合併p[end]>q[start];
區間端點重疊,需要連線p[end]=q[start];
區間無重疊,無操作,p[end]<q[start].
2.怎麼合併區間?
如果有重疊,比較兩個區間的結束結點,誰大用誰

class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        intervals.
sort(key=lambda x:x[0]) #根據x的第一個元素排序,用到Python的lambda表示式 res=[] #結果集 for interval in intervals:#遍歷區間 if len(res)==0: #如果結果集此刻為空,無需比較直接加入區間 res.append(interval) elif interval[0]>res[-1][1]: #每來一個新的區間要用它的start跟結果集中已有的區間的最後一個比較end res.
append(interval) else: res[-1][1] = max(res[-1][1],interval[1]) return res

補充Python的lambda表示式用法
大概就是把x+y 寫作 lambda 引數:表示式—>lambda x,y:x+y
區間的表達涉及list切片。list[0]第一列,list[-1]負向索引。參考
在這裡插入圖片描述

題號57

延續56題,56題題乾沒有宣告排序,我們給它排了序,57這道題題幹聲明瞭排序,讓我們給它保持排序。可以考慮直接把新區間加進去,此時是一個無序的,然後重新排序,就跟56的解法一毛一樣了。

class Solution:
    def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
        intervals.append(newInterval)
        res=[]
        intervals.sort(key=lambda x:x[0])
        for interval in intervals:
            if len(res)==0:
                res.append(interval)
            elif interval[0]>res[-1][1]:
                res.append(interval)
            else:
                res[-1][1] = max(interval[1],res[-1][1])
        return res

在這裡插入圖片描述