452.用最少数量的箭引爆气球
如果后一个气球的左边界小于等于上一个气球的右边界,那么就可以同时被一箭射爆,因此可以把这个气球和上一个气球看成新的个体,其右边界为两个气球的最小右边界,再去和下一个气球进行判断。
class Solution:
def findMinArrowShots(self, points: List[List[int]]) -> int:
points.sort(key=lambda x: x[0])
arrow = 1
for i in range(1, len(points)):
if points[i][0] > points[i-1][1]:
arrow += 1
else:
points[i][1] = min(points[i][1], points[i-1][1])
return arrow
435.无重叠区间
先按照右边界排序,然后从左向右看是否重叠(和上一题类似),纪录重叠个数并按照重叠区间改变右边界。
class Solution:
def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
intervals.sort(key=lambda x:x[1])
overlap = 0
for i in range(len(intervals)-1):
if intervals[i][1] > intervals[i+1][0]:
overlap += 1
intervals[i+1][1] = intervals[i][1]
return overlap
763.划分字母区间
先把每一个位置上的字母计算出它出现的最远的位置,然后遍历字符串,设置左边界和右边界,如果字符串的最后出现位置大于现在的右边界,则把右边界重新设定为该位置,如果当前位置就是右边界,则把左右边界内的字符串就是一个分割,左边界重设为右边界+1。
class Solution:
def partitionLabels(self, s: str) -> List[int]:
position = {}
for i in range(len(s)):
position[s[i]] = i
right = 0
left = 0
ans = []
for i in range(len(s)):
right = max(right, position[s[i]])
if right == i:
ans.append(right-left+1)
left = right + 1
return ans