day29 贪心算法03

80 阅读1分钟

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

文章讲解

思路:

1 points小到大排序
21开始遍历,如果没有重叠,箭+1;如果有重叠,更新当前point的右边界
class Solution:
    def findMinArrowShots(self, points: List[List[int]]) -> int:
        if len(points) ==0 :return 0
        points.sort(key = lambda x: (x[0], x[1])) 
        # (x[0], x[1]) 创建了一个元组,排序时会首先比较元组的第一个元素(即起始点),如果起始点相同,则比较第二个元素(即结束点)。
        
        result = 1 # 至少一根
        for i in range(1, len(points)):
            if points[i][0] > points[i-1][1]:
                # 不重叠时候多加一支箭
                result += 1
            else:
                points[i][1] = min(points[i][1], points[i-1][1])
        return result

435. 无重叠区间

文章讲解

思路:

1 排序
2 迭代区间,不重叠时啥也不做;重叠时候记录删除的数量,然后更新右边界
注意:只在一点上接触的区间是 不重叠的
class Solution:
    def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
        if len(intervals) == 0:
            return 0

        result = 0 # 待删除的区间数量
        for i in range(1, len(intervals)):
            # 不重叠>=不用移除
            # 重叠
            if intervals[i][0] < intervals[i-1][1]:
                result += 1
                intervals[i][1] = min(intervals[i-1][1], intervals[i][1])        
        
        return result

763. 划分字母区间

文章讲解

思路:

1 首先用hash记录每个字符的最远出现距离
2 然后迭代s,找到每个区间
class Solution:
    def partitionLabels(self, s: str) -> List[int]:
        result = []
        last_occurrence = {} # 最后出现位置
        # 记录字符到最远出现距离的映射
        for i in range(len(s)):
            last_occurrence[s[i]] = i

        # 找到边界
        left, right = 0, 0
        for i in range(len(s)):
            right = max(right, last_occurrence[s[i]])
            if i == right:
                result.append(right - left + 1) # 记录长度
                left = i + 1 # 更新左边界
        
        return result