【代码随想录训练营】【Day 38】【贪心-5】| Leetcode 435, 763, 56

【代码随想录训练营】【Day 38】【贪心-5】| Leetcode 435, 763, 56

需强化知识点

  • 重叠区间系列 题, 763, 435

题目

435. 无重叠区间

  • 左起点排序,记录重叠区间个数,总数相减即为结果,过程中维护右边界
  • 注意:出现重叠区域时,右边界取最小值,即保留更靠左的区间,来使得后面区间更有可能不重合,从而移除次数最少
class Solution:
    def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
        intervals.sort(key = lambda x: x[0])
        times = 0
        sr = intervals[0][1]
        for i in range(1, len(intervals)):
            if intervals[i][0] >= sr:
                sr = intervals[i][1]
            else:
                times += 1
                sr = min(sr, intervals[i][1])
        return times

763. 划分字母区间

  • 思路:记录每个字母出现的最大位置,然后再次遍历,当遇到 i == 最大位置时,则可以切分一次
class Solution:
    def partitionLabels(self, s: str) -> List[int]:
        label_index = [-1] * 26
        result = []
        max_right = -1
        start_index = 0

        for i, c in enumerate(s):
            label_index[ord(c) - ord('a')] = max(label_index[ord(c) - ord('a')], i)
        
        for i , c in enumerate(s):
            max_right = max(max_right, label_index[ord(c) - ord('a')])
            if i == max_right:
                result.append(i - start_index + 1)
                start_index = i+1
        return result

56. 合并区间

  • 思路:遇到重叠进行合并,遇到不重叠,保存之前区间
class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        intervals.sort(key = lambda x: x[0])
        result = []

        sl, sr = intervals[0][0], intervals[0][1]
        for i in range(1, len(intervals)):
            if intervals[i][0] <= sr:
                sr = max(sr, intervals[i][1])
            else:
                result.append([sl, sr])
                sl, sr = intervals[i][0], intervals[i][1]
        result.append([sl, sr])
        return result



           
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值