代码随想录第36天|435. 无重叠区间、763.划分字母区间、56. 合并区间

98 阅读2分钟

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

做了前两道题,这道题就简单了起来。