python 重叠合并_在Python中合并重叠间隔

I am trying to solve a question wherein overlapping intervals need to be merged: https://leetcode.com/problems/merge-intervals/description/

The question is:

Given a collection of intervals, merge all overlapping intervals.

For example, Given [1,3],[2,6],[8,10],[15,18], return [1,6],[8,10],[15,18].

I tried my solution:

# Definition for an interval.

# class Interval:

# def __init__(self, s=0, e=0):

# self.start = s

# self.end = e

class Solution:

def merge(self, intervals):

"""

:type intervals: List[Interval]

:rtype: List[Interval]

"""

start = sorted([x.start for x in intervals])

end = sorted([x.end for x in intervals])

merged = []

j = 0

new_start = 0

for i in range(len(start)):

if start[i]

continue

else:

j = j + 1

merged.append([start[new_start], end[j]])

new_start = i

return merged

However it is clearly missing the last interval as:

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

Answer :[[1,6],[8,10]]

Expected answer: [[1,6],[8,10],[15,18]]

Not sure how to include the last interval as overlap can only be checked in forward mode.

How to fix my algorithm so that it works till the last slot?

Thanks for your help.

解决方案

Your code implicitly already assumes the starts and ends to be sorted, so that sort could be left out. To see this, try the following intervals:

intervals = [[3,9],[2,6],[8,10],[15,18]]

start = sorted([x[0] for x in intervals])

end = sorted([x[1] for x in intervals]) #mimicking your start/end lists

merged = []

j = 0

new_start = 0

for i in range(len(start)):

if start[i]

continue

else:

j = j + 1

merged.append([start[new_start], end[j]])

new_start = i

print(merged) #[[2, 9], [8, 10]]

Anyway, the best way to do this is probably recursion, here shown for a list of lists instead of Interval objects.

def recursive_merge(inter, start_index = 0):

for i in range(start_index, len(inter) - 1):

if inter[i][1] > inter[i+1][0]:

new_start = inter[i][0]

new_end = inter[i+1][1]

inter[i] = [new_start, new_end]

del inter[i+1]

return recursive_merge(inter.copy(), start_index=i)

return inter

sorted_on_start = sorted(intervals)

merged = recursive_merge(sorted_on_start.copy())

print(merged) #[[2, 10], [15, 18]]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值