一、56. 合并区间
本题也是重叠区间问题,如果昨天三道都吸收的话,本题就容易理解了。
1. 解题思路
(1)首先对区间按照左边界进行排序,方便对重叠区间进行处理。
(2)对重叠的判断:当前区间的左边界小于等于上一个区间的右边界,说明两个区间存在重叠;从而对重叠区间进行合并操作。如果两个区间不重叠,就重新定义一个result数组将区间放入即可。
2. 代码实现
(1)定义一个二维数组用于记录我们最后的结果。
(2)如果输入的区间是空,那么直接返回我们的空result结果。
(3)对输入的区间按照左边界进行排序。将第0个区间先放进结果集,因为至少有一个区间是一定存在的。如果后面的区间有重叠的话,那么直接让区间进行合并,直接在result数组里进行修改。
(4)遍历区间,从1开始。如果当前遍历的区间左边界小于等于上一个区间的右边界(由于前面重叠的已合并,所以也就是区间最后一个位置),此时发现重叠需要进行合并操作。但是由于按照左边界进行排序的,所以左边界无需进行更新,一定是最小的,所以需要更新新区间的右边界。新区间的右边界更新为二者较大值即可。如果没重叠就直接放进result数组即可。
(5)返回result。
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
result = []
if len(intervals) == 0:
return result
intervals.sort(key=lambda x: x[0])
result.append(intervals[0])
for i in range(1, len(intervals)):
if result[-1][1] >= intervals[i][0]:
result[-1][1] = max(intervals[i][1],result[-1][1])
else:
result.append(intervals[i])
return result
二、738.单调递增的数字
738.单调递增的数字
代码实现
(1)为方便遍历数字,将传入的int型转化为string型。flag用于将后面的数字全部赋成9,由于为了避免string本身就符合题目条件的情况,那么将其初始化为0最后会将所有位置全赋成9,所以只能初始化为s的长度。
(2)从后向前for循环遍历:如果string的 i-1 小于 i ,那么string[i-1]需要自减1,同时需要将后面的值全部赋成9,但在此处我们用flag标记一下 i ,用于从第i向后全部都赋成9。
(3)接下来,对i后全赋成9进行处理:for循环遍历从i开始的string,全部赋值为9。
(4)由于最后返回int型,那么需要将string转换为int。
class Solution:
def monotoneIncreasingDigits(self, n: int) -> int:
str_num = str(n)
flag = len(str_num)
for i in range(len(str_num)-1, 0, -1):
if str_num[i] < str_num[i-1]:
flag = i
str_num = str_num[:i-1] + str(int(str_num[i-1])-1)+str_num[i:]
for i in range(flag, len(str_num)):
str_num = str_num[:i]+'9'+str_num[i+1:]
return int(str_num)