【代码随想录算法训练营第三十六天|452.用最少数量的箭引爆气球、435.无重叠区间、763.划分字母区间】

452.用最少数量的箭引爆气球

如果后一个气球的左边界小于等于上一个气球的右边界,那么就可以同时被一箭射爆,因此可以把这个气球和上一个气球看成新的个体,其右边界为两个气球的最小右边界,再去和下一个气球进行判断。

class Solution:
    def findMinArrowShots(self, points: List[List[int]]) -> int:
        points.sort(key=lambda x: x[0])
        arrow = 1
        for i in range(1, len(points)):
            if points[i][0] > points[i-1][1]:
                arrow += 1
            else:
                points[i][1] = min(points[i][1], points[i-1][1])
        return arrow

435.无重叠区间

先按照右边界排序,然后从左向右看是否重叠(和上一题类似),纪录重叠个数并按照重叠区间改变右边界。

class Solution:
    def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
        intervals.sort(key=lambda x:x[1])
        overlap = 0
        for i in range(len(intervals)-1):
            if intervals[i][1] > intervals[i+1][0]:
                overlap += 1
                intervals[i+1][1] = intervals[i][1]
        return overlap

763.划分字母区间

先把每一个位置上的字母计算出它出现的最远的位置,然后遍历字符串,设置左边界和右边界,如果字符串的最后出现位置大于现在的右边界,则把右边界重新设定为该位置,如果当前位置就是右边界,则把左右边界内的字符串就是一个分割,左边界重设为右边界+1。

class Solution:
    def partitionLabels(self, s: str) -> List[int]:
        position = {}
        for i in range(len(s)):
            position[s[i]] = i
        right = 0
        left = 0
        ans = []
        for i in range(len(s)):
            right = max(right, position[s[i]])
            if right == i:
                ans.append(right-left+1)
                left = right + 1
        return ans
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

stark的小笨手2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值