435. 无重叠区间
1. first idea
和代码随想录第35天|860. 柠檬水找零、406. 根据身高重建队列、452. 用最少数量的箭引爆气球 - 掘金 (juejin.cn)中的气球很像。
我们先对气球排序,排序好后,
连在一起的情况需要删除延伸出去的那个区域。
如果出连续则跳过即可。
class Solution:
def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
intervals.sort(key=lambda x: x[1])
# print(intervals)
count = 0
for idx in range(1, len(intervals)):
if intervals[idx][0] >= intervals[idx - 1][1]:
continue
else:
intervals[idx][1] = min(intervals[idx][1], intervals[idx - 1][1])
count += 1
return count
763. 划分字母区间
1. doc reading
由于没看懂题,所以直接看了文档。
目标是把所有相同字母都圈定在一个区间内。 这样的区间尽可能多。
所以我们实际上可以把不同种字母分离开来,每种字母都看作一个气球。
也就是说他们彼此穿插实际上就看作气球之间的重叠。
class Solution:
def partitionLabels(self, s: str) -> List[int]:
s_list = list(s)
s_dict = dict()
for idx_int in range(len(s_list)):
if s_list[idx_int] not in s_dict.keys():
s_dict[s_list[idx_int]] = []
s_dict[s_list[idx_int]].append(idx_int)
s_dict_list = list(s_dict.items())
s_dict_list.sort(key=lambda kv: kv[-1][0])
# print(s_dict_list)
split_list = []
for idx in range(1, len(s_dict_list)):
if s_dict_list[idx][1][0] > s_dict_list[idx - 1][1][-1]:
# 这两个字母不连续,有一个分割点。
if split_list:
pre_idx = sum(split_list)
else:
pre_idx = 0
split_list.append(s_dict_list[idx - 1][1][-1] + 1 - pre_idx)
else:
s_dict_list[idx][1].append(max(s_dict_list[idx - 1][1][-1], s_dict_list[idx][1][-1]))
split_list.append(s_dict_list[-1][1][-1] - sum(split_list) + 1) # 最后一个需要跳出循环后才能补上。
return split_list
56. 合并区间
1. first idea
如果两个区间连续,就合并。
如果不连续,就将前面的区间加入到结果列表。
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
intervals.sort(key=lambda x: x[0])
res_list = [[intervals[0][0]]]
for idx in range(1, len(intervals)):
if intervals[idx][0] > intervals[idx - 1][1]:
# 不连续
res_list[-1].append(intervals[idx - 1][1]) # 先把上一个区间的右边界加上。
res_list.append([intervals[idx][0]]) # 再把下一个区间的左边界加上。
else:
intervals[idx][1] = max(intervals[idx][1], intervals[idx - 1][1])
# print(intervals)
res_list[-1].append(intervals[-1][1])
return res_list
做了前两道题,这道题就简单了起来。