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
区间问题
先排序
贪心出发,存储符合条件的(可能是最大)下标点
判断条件一般都是用遍历到的下标和存储的下标点比较