代码随想录算法训练营第三十五天| 贪心算法04

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

代码随想录

重叠区间问题,注意点:

1. 只要points长度不为0,那么至少是需要一只箭的,所以result初始值为1

2. 排序后,如果当前元素第一个值比前一个元素最后一个值小,那么说明不在一个区间里

3. 在相同区间里的话,需要选择最短尾端

class Solution:
    def findMinArrowShots(self, points: List[List[int]]) -> int:
        if len(points)==0:return 0
        result=1
        points.sort(key=lambda x:x[0])
        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
        intervals.sort(key=lambda x:x[0])
        n=len(intervals)
        result=1
        for i in range(1,n):
            if intervals[i-1][1]<=intervals[i][0]:
                result+=1
            else:
                intervals[i][1]=min(intervals[i-1][1],intervals[i][1])
        return n-result

763.划分字母区间

代码随想录

注意点:

1. 遍历一遍,确定每个字母的最后位置

2. 若到达最远位置,则划分出一个区间

class Solution:
    def partitionLabels(self, s: str) -> List[int]:
        last_occurred={}
        for i,ch in enumerate(s):
            last_occurred[ch]=i
        result=[]
        start=end=0
        for i,ch in enumerate(s):
            end=max(end,last_occurred[ch])
            if i==end:
                result.append(end-start+1)
                start=i+1
        return result

你可能感兴趣的:(贪心算法,算法)