区间和重叠合并 python_九月,区间合并,插入,求交集,删除被覆盖区间算法...

@Author:Runsen

我从来不是一个呆在舒适区间的人,高中毕业,大学往死了干了三年,毕竟还是要靠实力说话啊,努力、自制、对照下,喜欢呆在舒适区间里人,没紧迫感、没压力、不思进取、“人无远虑必有近忧”的人。这么一想,我好像也有点强逼自己变得更强。

今天还是按时打卡,搞区间系列,区间其实看了东哥的文章,然后去刷的。下面就是东哥的文章

东哥的一文秒杀所有区间相关问题

话说东哥是何人,搜下labuladong,看过Leetcode题解,就知道此人算法非常厉害。我还是跟着学起来。

文章目录

Leetcode 56. 合并区间

Leetcode 57.插入区间

Leetcode 986. 区间列表的交集

Leetcode 1288. 删除被覆盖区间

后言(日记)

来吧,我还是那个少年。

Leetcode 56. 合并区间

示例 1:

输入: intervals = [[1,3],[2,6],[8,10],[15,18]]

输出: [[1,6],[8,10],[15,18]]

解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:

输入: intervals = [[1,4],[4,5]]

输出: [[1,5]]

解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。

此题,我大二应该做过,可惜那是以前的我。现在的我好像还可以A掉。

原理就是:新的区间左边的数字为原第一个区间左边的数字,新区间右边的数字为 原第一个区间右边数字和原第二个区间右边数字的最大值。

比如[0, 4], [3, 5]

0 <= 3

4 >= 3

新区间为[0, 5]。

class Solution:

def merge(self, intervals: List[List[int]]) -> List[List[int]]:

if not intervals: return []

# 对区间进行排序

intervals.sort(key=lambda x:x[0])

res = [intervals[0]]

for i in range(1,len(intervals)):

if intervals[i][0] <= res[-1][1]:

res[-1] = [res[-1][0], max(intervals[i][1], res[-1][1])]

else:

res.append(intervals[i])

return res

Leetcode 57.插入区间

Leetcode 57.插入区间和 Leetcode 56. 合并区间完全一样,还困难程度!

示例 1:

输入:intervals = [[1,3],[6,9]], newInterval = [2,5]

输出:[[1,5],[6,9]]

示例 2:

输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]

输出:[[1,2],[3,10],[12,16]]

解释:这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。

class Solution:

def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:

# 其原理和合并区间一样

intervals.append(newInterval)

intervals.sort()

res = [intervals[0]]

for i in range(1,len(intervals)):

# 判断

if res[-1][1] >= intervals[i][0]:

res[-1] = [res[-1][0],max(res[-1][1],intervals[i][1])]

else:

res.append(intervals[i])

return res

Leetcode 986. 区间列表的交集

区间列表的交集,大家直接看东哥的文章,人家确实写得不错,就是一个双指针。关键就是最后一步,指针i和j什么时候应该前进呢?只要判断两个数组右指针的大小可以 了。

class Solution:

def intervalIntersection(self, A: List[List[int]], B: List[List[int]]) -> List[List[int]]:

i, j = 0, 0 # 双指针

res = []

while i < len(A) and j < len(B):

a1, a2 = A[i][0], A[i][1]

b1, b2 = B[j][0], B[j][1]

# 两个区间存在交集

if b2 >= a1 and a2 >= b1:

# 计算出交集,加入 res

res.append([max(a1, b1), min(a2, b2)])

# 指针前进

if b2 < a2:

j += 1

else:

i += 1

return res

Leetcode 1288. 删除被覆盖区间

示例:

输入:intervals = [[1,4],[3,6],[2,8]]

输出:2

解释:区间 [3,6] 被区间 [2,8] 覆盖,所以它被删除了。

class Solution:

def removeCoveredIntervals(self, intervals: List[List[int]]) -> int:

# 排序

intervals.sort(key = lambda x: (x[0], -x[1]))

count = 0

prev_end = 0

for _, end in intervals:

if end > prev_end:

count += 1

prev_end = end

return count

上面的代码来自Leetcode官网,我看了东哥的解法,写的不错,因为写在这里已经晚上11.50了,我刚刚刷了上面的三题,从10点半到现在。

后言(日记)

昨天跑步的时候摔了一跤,但是我今天怎么可能不跑,这可不像我?

今天,还是跑了五公里。

还有八个月后(3+5),他就要毕业了。

他即将面临求学路上的第一次选择。

为了自己的梦想,

他努力着,他们坚持着。

父母的期望,老师的教导,

就像无形的压力。

现实是残酷的,

竞争是激烈的。

有人的进步,

就意味着有人的退步。

成绩再好,

一个班总有最后几名。

因此,跟自己比,

远比与他人比要有意义的多。

世上没有两片相同的树叶,也没有两个完全相同的人。

天生我材必有用。

三百六十行,行行出状元。

不论结果如何,

尽力了便无遗憾。

人生的路更长,

未来的道路,

谁又能说的清楚?

笑到最后才笑得最好。

努力吧,少年!向上吧,少年!

一切皆有可能。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值