今天的区间重叠问题上优化的题解都只使用的单边排序的方法。
452. 用最少数量的箭引爆气球
leetcode 452. 用最少数量的箭引爆气球
代码随想录
class Solution:
def findMinArrowShots(self, points: List[List[int]]) -> int:
# 只用考虑区间的结束。
length = len(points)
if length == 1:
return 1
points.sort(key=lambda x :x[1])
res = 1
end = points[0][1]
for i in range(1, length):
if points[i][0] > end:
res += 1
end = points[i][1]
return res
class Solution:
def findMinArrowShots(self, points: List[List[int]]) -> int:
# 排序x_start, x_end
points.sort(key=lambda x:(x[0],x[1]))
# print(points)
res = 1
start, end = points[0]
for i in range(1,len(points)):
if points[i][0]<= end:
start = points[i][0]
end = min(points[i][1], end)
else:
res += 1
start, end = points[i]
return res
435. 无重叠区间
class Solution:
def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
intervals.sort(key=lambda x:x[0])
print(intervals)
count = 0
end = intervals[0][1]
for i in range(1, len(intervals)):
if intervals[i][0] < end: # 有覆盖,选择一个(保留end小的)删除
count += 1
end = min(end, intervals[i][1])
else:
end = intervals[i][1]
return count
763.划分字母区间
class Solution:
def partitionLabels(self, s: str) -> List[int]:
# 先统计一下字符出现的起始位置
# 然后就可以转化为区间覆盖问题
# 这里就是不断的扩充区间的end
char_position = [[-1,-1] for _ in range(26)]
index = 0
for char in s:
char_index = ord(char)-ord('a')
if char_position[char_index][0] == -1:
char_position[char_index][0] = index
char_position[char_index][1] = index
else:
char_position[char_index][1] = index
index += 1
start, end = char_position[ord(s[:1])-ord('a')]
res = []
for char in s[1:]:
char_index = ord(char)-ord('a')
# 有重叠的时候
if char_position[char_index][0] < end:
end = max(char_position[char_index][1], end)
else:
# 换新的区间的时候
res.append(end - start + 1)
start, end = char_position[char_index]
res.append(end - start + 1)
return res