贪心算法05 | ● 435. 无重叠区间 ● *763.划分字母区间 ● *56. 合并区间

文章讲述了如何使用贪心算法处理无重叠区间问题,包括对区间进行排序、合并重叠部分,以及如何在字母区间划分中应用相似思路。还讨论了代码实现中的问题和解决方案。
摘要由CSDN通过智能技术生成

435. 无重叠区间

https://programmercarl.com/0435.%E6%97%A0%E9%87%8D%E5%8F%A0%E5%8C%BA%E9%97%B4.html

  • 考点
    • 贪心算法
    • 重叠区间
  • 我的思路
    • 先按照区间左坐标进行排序,方便后续处理
    • 进行for循环,循环范围是0到倒数第二个元素
    • 如果当前区间和下一区间重叠,结果计数加1,同时令下一区间的右坐标等于两个区间右坐标中的较小者,这里体现出了贪心的思路,因为取较小者即令区间尽可能小,也就降低了其与其它区间重叠的可能
    • 计数完毕后返回即可
  • 视频讲解关键点总结
    • 和我的思路类似
  • 我的思路的问题
  • 代码书写问题
  • 可执行代码
class Solution:
    def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
        intervals.sort(key=lambda x: x[0])
        result = 0
        for i in range(len(intervals) - 1):
            if intervals[i + 1][0] < intervals[i][1]:
                result += 1
                intervals[i + 1][1] = min(intervals[i][1], intervals[i + 1][1])
        return result

*763.划分字母区间

https://programmercarl.com/0763.%E5%88%92%E5%88%86%E5%AD%97%E6%AF%8D%E5%8C%BA%E9%97%B4.html

  • 考点
    • 本题不是贪心,但思路近似于重叠区间,因此放到这里
    • 如何记录字母最后出现的位置
    • 有了字母最后位置,如何让整个区间的字母均满足要求
  • 我的思路
    • 无思路
  • 视频讲解关键点总结
    • 本题两个关键点写在了考点里
    • 一,先遍历一遍字符串,记录每个字符出现的最后位置的索引
    • 二,在循环遍历字符串的过程中,用一个变量记录遍历过的字符所对应的索引最大值,当当前索引和最大值吻合时,记录一次结果
  • 我的思路的问题
    • 无思路
  • 代码书写问题
  • 可执行代码
class Solution:
    def partitionLabels(self, s: str) -> List[int]:
        last_position = [0] * 26
        for i in range(len(s)):
            last_position[ord(s[i]) - ord('a')] = i
        result = []
        start_index = 0
        end_index = 0
        for i in range(len(s)):
            end_index = max(end_index, last_position[ord(s[i]) - ord('a')])
            if i == end_index:
                result.append(i - start_index + 1)
                start_index = end_index + 1
                end_index = 0
        return result

*56. 合并区间

https://programmercarl.com/0056.%E5%90%88%E5%B9%B6%E5%8C%BA%E9%97%B4.html

  • 考点
    • 贪心算法
    • 重叠区间
  • 我的思路
    • 如果区间有重叠,将区间合并,知道当前区间和下一区间不重叠,将当前区间加入结果
  • 视频讲解关键点总结
    • 先将第一个区间加入结果列表中
    • 之后判断原列表的当前区间与结果列表的最后一个区间是否重叠,如果重叠,更新结果列表的最后一个区间
    • 如果不重叠,直接把当前区间加入结果列表
  • 我的思路的问题
    • 会遗漏最后一个区间
  • 代码书写问题
  • 可执行代码
class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        intervals.sort(key=lambda x: x[0])
        result = [intervals[0]]
        for i in range(1, len(intervals)):
            if result[-1][1] >= intervals[i][0]:
                result[-1][0] = min(intervals[i][0], result[-1][0])
                result[-1][1] = max(intervals[i][1], result[-1][1])
            else:
                result.append(intervals[i])
        return result
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值