代码随想录算法训练营day30| 452. 用最少数量的箭引爆气球 435. 无重叠区间 763.划分字母区间

学习资料:https://programmercarl.com/0452.用最少数量的箭引爆气球.html

重叠区域问题
最远位置问题

452.用最少数量的箭引爆气球(重叠区域;按左边界排序;i区间的左边界与i-1区间的右边界比较来确定是否重叠;更新i的右边界,取i与i-1区域右边界的最小值)

点击查看代码
class Solution(object):
    def findMinArrowShots(self, points):
        """
        :type points: List[List[int]]
        :rtype: int
        """
        # 贪心:尽量让重叠部分被一根箭射爆,难点在于怎么处理重叠部分
        # 当没有气球就不需要箭
        if not points:
            return 0
        # 按照每个位置气球的左边界进行排序,方便后续重叠部分处理
        points.sort(key=lambda x:x[0])
        # 至少一根箭
        min_num = 1
        # 开始遍历每个位置
        for i in range(1, len(points)):
            # 用该位置的左边界和上一个位置的右边界的大小来判断是否有重叠。如果无重叠,那必然加一根箭
            if points[i][0] > points[i-1][1]:
                min_num += 1
            # 如果有重叠,要根据前后位置的各自的右边界的大小来更新当前位置的右边界。取较小的右边界,方便后面循环若还有重叠部分,判断是否为三重叠,还是仅为两重叠
            else:
                points[i][1] = min(points[i][1], points[i-1][1])
        return min_num

435.无重叠区间(求重叠的个数,就是要删除的区间个数)

点击查看代码
class Solution(object):
    def eraseOverlapIntervals(self, intervals):
        """
        :type intervals: List[List[int]]
        :rtype: int
        """
        # 贪心:题目要通过删除部分区间来实现无重叠,那我只需要求出现在区间的重叠个数,这个个数就是要删除的区间个数
        count = 0
        intervals.sort(key=lambda x:x[0])  # 对区间集合按左边界排序
        for i in range(1, len(intervals)):
            if intervals[i][0] >= intervals[i-1][1]:  # 无重叠,不操作
                pass
            else:
                count += 1
                intervals[i][1] = min(intervals[i][1], intervals[i-1][1])   # 为了判断i+1与(i-1,i)的重叠,需要更新i的右边界,使得该值是i-1与i的较小值
        return count

        

763.划分字母区间(妙哉,统计同一个字母的最远索引;向后迭代如果该字母的最远索引超过前一个的就更新最远索引,一直到遍历位置等于最远索引时,获取这一段字母,后续更新left,继续找下一段字母)

点击查看代码
class Solution(object):
    def partitionLabels(self, s):
        """
        :type s: str
        :rtype: List[int]
        """
        # 找到每种字母的最远位置(字母,最远索引)
        hashdict = {}
        for i in range(len(s)):
            hashdict[s[i]] = i
        # 左指针是这一片段的起点,不断向后遍历,及时更新右指针为最远索引,一直到遍历到了(i追上right)右指针,则获得一个片段
        result = []
        left = 0
        right = 0
        for i in range(len(s)):
            right = max(right, hashdict[s[i]])  # 当遍历到一个新元素时,该元素的最远指针与前面的不同,要选择更远的指针
            if i == right:
                result.append(right-left+1)  # 计算片段长度
                left = i+1                   # 左指针更新
        return result
        

PS:今天阴得很,居然没下雨,吃了很多快餐,煎饼、杂酱面、饭团、包子
今天是day30了耶,虽然很累但是还是很快,但是还是很累只剩一半了,越学越轻松了感觉
不想面试,不想测试,感觉自己好菜

posted @ 2024-10-29 20:59  Tristan241001  阅读(16)  评论(0)    收藏  举报