56. 合并区间
思路
这道题的核心是先排序,再合并,通过排序让重叠 / 相邻的区间挨在一起,再遍历一次就能完成合并。
解题思路
-
特殊情况处理:如果输入数组为空,直接返回空数组。
-
排序 :按照区间的起始值从小到大排序,这样所有可能重叠的区间都会相邻。
-
遍历合并:
-
初始化结果数组,放入第一个区间。
-
遍历后续每个区间,与结果数组中最后一个区间比较:
-
如果当前区间的起始值 ≤ 最后一个区间的结束值 → 重叠 / 相邻,合并(更新结束值为两者最大值)。
-
如果当前区间的起始值 > 最后一个区间的结束值 → 不重叠,直接加入结果数组。
-
-
提交

python
def merge(intervals):
# 1. 处理空数组
if not intervals:
return []
# 2. 按照区间的起始值排序
intervals.sort(key=lambda x: x[0])
# 3. 初始化结果数组,放入第一个区间
res = [intervals[0]]
# 4. 遍历剩余区间
for current in intervals[1:]:
# 取出结果数组中最后一个区间
last = res[-1]
# 判断是否重叠/相邻:当前区间起始 <= 最后一个区间的结束
if current[0] <= last[1]:
# 合并区间:更新结束值为最大值
last[1] = max(last[1], current[1])
else:
# 不重叠,直接添加
res.append(current)
return res
738.单调递增的数字
题目链接738. 单调递增的数字 - 力扣(LeetCode)
思路
这道题的核心是用贪心算法 :从右往左检查数字,遇到前一位 > 后一位时,前一位减 1,后面所有位都变成 9,就能得到最大的单调递增数。
解题思路
-
转字符串 / 列表:方便逐位修改数字(整数无法直接修改某一位)。
-
从右往左遍历:
-
如果当前位 < 前一位(不满足递增),前一位减 1,记录当前位置。
-
把记录位置及后面所有位都设为 9(保证最大)。
-
-
转回整数:得到最终结果。
提交

python
def monotoneIncreasingDigits(n: int) -> int:
s = list(str(n))
length = len(s)
nine_start = length
# 从右往左遍历
for i in range(length - 2, -1, -1):
if s[i] > s[i + 1]:
s[i] = str(int(s[i]) - 1)
nine_start = i + 1
# 统一变成 字符串 '9',这是关键!
for i in range(nine_start, length):
s[i] = '9' # 必须是字符串,不是数字
return int(''.join(s))