day36 56.合并区间 738.单调递增的数字
56. 合并区间
以数组 intervals
表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi]
。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
示例 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] 可被视为重叠区间。
提示:
1 <= intervals.length <= 104
intervals[i].length == 2
0 <= starti <= endi <= 104
第一种方法:
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
intervals.sort(key = lambda x: x[0]) # 按照左边界进行排序
if len(intervals) == 0:
return 0
result = [intervals[0]] # 直接将第一个区间放进结果集
for i in range(1, len(intervals)):
# 判断重叠
if intervals[i][0] <= result[-1][1]:
# 合并区间,只需更新结果集最后一个区间的右边界,因为根据前面的排序,左边界已经是升序
result[-1][1] = max(intervals[i][1], result[-1][1])
else:
result.append(intervals[i])
return result
738. 单调递增的数字
当且仅当每个相邻位数上的数字 x
和 y
满足 x <= y
时,我们称这个整数是单调递增的。
给定一个整数 n
,返回 小于或等于 n
的最大数字,且数字呈 单调递增 。
示例 1:
输入: n = 10 输出: 9
示例 2:
输入: n = 1234 输出: 1234
示例 3:
输入: n = 332 输出: 299
提示:
0 <= n <= 109
第一种方法(贪心算法):
class Solution:
def monotoneIncreasingDigits(self, n: int) -> int:
# 将整数转换为字符串
strNum = str(n)
# flag用来标记赋值9从哪里开始
# 设置为字符串长度,为了防止第二个for循环在flag没有被赋值的情况下执行
flag = len(strNum)
# 从右往左遍历
for i in range(len(strNum) - 1, 0, -1):
if strNum[i - 1] > strNum[i]:
flag = i # 更新flag,记录开始修改的位置
# 将前一个字符减1
strNum = strNum[:i - 1] + str(int(strNum[i - 1]) - 1) + strNum[i:]
for i in range(flag, len(strNum)):
# 将flag位置及之后的字符都修改为9,以保证最大的递增数字
strNum = strNum[:i] + '9' + strNum[i + 1:]
return int(strNum)