@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),他就要毕业了。

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

为了自己的梦想,

他努力着,他们坚持着。

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

就像无形的压力。

现实是残酷的,

竞争是激烈的。

有人的进步,

就意味着有人的退步。

成绩再好,

一个班总有最后几名。

因此,跟自己比,

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

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

天生我材必有用。

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

不论结果如何,

尽力了便无遗憾。

人生的路更长,

未来的道路,

谁又能说的清楚?

笑到最后才笑得最好。

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

一切皆有可能。