452. 用最少数量的箭引爆气球
思路:
1 points小到大排序
2 从1开始遍历,如果没有重叠,箭+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