280 字
1 分钟
代码随想录算法训练营第二十七天 | 贪心算法 Part05
56. 合并区间
- 先按起点升序排序;
- 然后遍历每个区间:
- 如果当前区间起点小于等于结果中最后区间的终点,说明重叠 → 合并;
- 否则为不重叠 → 直接加入结果。
class Solution: def merge(self, intervals: List[List[int]]) -> List[List[int]]: res = [] # 先按起点排序 intervals.sort(key=lambda x: x[0])
res.append(intervals[0]) # 初始化结果列表
for i in range(1, len(intervals)): cur = intervals[i] end = res[-1] if cur[0] <= end[1]: # 区间重叠,合并 end[1] = max(end[1], cur[1]) else: # 不重叠,直接添加 res.append(cur)
return res
738. 单调递增的数字
LeetCode 738. Monotone Increasing Digits
- 从右向左遍历字符串;
- 一旦发现前一位大于后一位,就将前一位 -1,并将后面所有位置改为 9;
- 因为此时要保证变小,且尽可能大。
class Solution: def monotoneIncreasingDigits(self, n: int) -> int: num_list = list(str(n))
# 从右往左找第一个出现递减的位置 for i in range(len(num_list) - 1, 0, -1): if num_list[i - 1] > num_list[i]: # 前一位比后一位大,当前位减一,后续全部置为 9 num_list[i - 1] = str(int(num_list[i - 1]) - 1) for j in range(i, len(num_list)): num_list[j] = '9'
return int(''.join(num_list))
代码随想录算法训练营第二十七天 | 贪心算法 Part05
https://fuwari.vercel.app/posts/code_musings_day_twenty-seven/