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

贪心第四天,452. 用最少数量的箭引爆气球435. 无重叠区间,763. 划分字母区间。今天题目套路差不多,都是重叠区域类型的。重点在于判断边界条件,整体难度不算太高。

452. 用最少数量的箭引爆气球 & 435. 无重叠区间

452. 用最少数量的箭引爆气球 - 力扣(LeetCode)

435. 无重叠区间 - 力扣(LeetCode)

两道题思路一模一样。就是先通过左端点从大到小排序(右端点也可以排序)。如果出现了第二个区间的左端点大于第一个区间的右端点,就证明是不重复(无重叠区间题目说明了有单独一个点重合不算重合,所以是大于等于)。然后就是另一种情况,左端点小于前一区间右端点,就是有重复了,这时候去选取这两个区间的右端点的最小值,用图说明会方便一点,这就是判断重复区间的方法。

无重叠区间则是刚好反过来,因为气球这道题是判断有多少个重复区间,就是非相交的重复区域,用n-重复就是需要删除的区间。

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

      
# 无重复区间
class Solution:
    def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
        # 1 2
        # 1   3
        #   2 3
        #     3 4
        intervals.sort(key = lambda x: x[0])
        n = len(intervals)
        cnt = 1

        for i in range(1, n):
            if intervals[i][0] >= intervals[i-1][1]:
                cnt += 1
            else:
                intervals[i][1] = min(intervals[i-1][1], intervals[i][1])
        return n - cnt

763. 划分字母区间

763. 划分字母区间 - 力扣(LeetCode)

思路和之前的题略有不同。"ababcbacadefegdehijhklij" 类似于这种字串,第一个为a,就开始检索最远的a,然后到最远的a的区间内,每个字母最远在哪,逐渐直到当前区间的右端点和最远点相等。所以为了判断最远距离,就要先用字典遍历保存每个字母的最大下标值。然后在第二次遍历的时候,不断用字典中每个字母的值将最远点进行更新。

class Solution:
    def partitionLabels(self, s: str) -> List[int]:
        occur = {}
        for i,c in enumerate(s):
            occur[c] = i

        ans = []
        start = 0
        end = 0

        for i,c in enumerate(s):
            end = max(end, occur[c])
            if end == i:
                ans.append(end-start+1)
                start = end + 1

        return ans

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值