Day 36 | 贪心算法05

69 阅读1分钟

435. 无重叠区间

贪心的思想:遇到符合条件的 就存储

def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
    intervals = sorted(intervals, key= lambda x: x[1])
    n_i = len(intervals)
    un = 1
    end = intervals[0][1]
    # 类似于气球题的思路
    # 求非交叉区间的个数
    for i in range(1,len(intervals)):
        if end <= intervals[i][0]:
            un += 1
            end = intervals[i][1]
    return n_i - un

763. 划分字母区间

理解思路

不断更新包含当前字符的终点位置,如果结束,则进入下一片段

def partitionLabels(self, s: str) -> List[int]:
    ls = list(s)
    end = [0] * 26
    res = []
    for i, l in enumerate(ls):
        end[int(ord(l)-ord('a'))] = i
    for i, l in enumerate(ls):
        if res == []:
            res.append(end[int(ord(l)-ord('a'))])
        else:
            if i <= res[-1]:
                if end[int(ord(l)-ord('a'))] > res[-1]:
                    res[-1] = end[int(ord(l)-ord('a'))]
            else:
                res.append(end[int(ord(l)-ord('a'))])
    for j in range(len(res)-1,0,-1):
        res[j] = res[j] - res[j-1]
    res[0] += 1
    return res

56. 合并区间

def merge(self, intervals: List[List[int]]) -> List[List[int]]:
    
    intervals = sorted(intervals)
    res = [intervals[0]]

    for i in range(1, len(intervals)):
        # 上一个右边界比当前左边界大
        if intervals[i][0] <= res[-1][1]:
            res[-1][1] = max(intervals[i][1], res[-1][1])
        else:
            res.append(intervals[i])
    
    return res

区间问题

先排序

贪心出发,存储符合条件的(可能是最大)下标点

判断条件一般都是用遍历到的下标和存储的下标点比较