主要内容
重叠区间问题
贪心题目
435. 无重叠区间
思路分析
按照右区间从小到大排序(给下一个区间留更多的空间),从左向右找不相交区间的个数
代码
class Solution:
def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
# 按照右边界从小到达排序,从左到右记录非交叉区间的个数,
# 总区间个数减去非交叉区间极为要移除的区间
intervals.sort(key = lambda x : x[1])
n = len(intervals)
if n == 0:
return 0
# 记录非交叉区间的个数
count = 1
# 记录区间分割点
end = intervals[0][1]
for i in range(1,n):
if intervals[i][0] >= end:
end = intervals[i][1]
count += 1
return n - count
763.划分字母区间
思路分析
想法1:
首先遍历一遍字符串统计字母出现的次数
再遍历字符串,记录当前遍历到的集合元素,若达到count为0,则移除,若l为空,则记录到结果中
想法2:
记录每个字符出现的最远边界
再一次的遍历中,更新遇到的字符的最远边界的最大值,达到最大值则记录进结果
class Solution:
def partitionLabels(self, s: str) -> List[int]:
res = []
# 统计字母出现的次数
count = [0] * 26
for c in s:
count[ord(c)-ord('a')] += 1
# 记录当前遍历到的集合元素,若达到count为0,则移除
l = []
start = 0
for i, c in enumerate(s):
if c not in l:
l.append(c)
count[ord(c)-ord('a')] -= 1
if count[ord(c)-ord('a')] == 0:
l.remove(c)
if len(l) == 0:
res.append(i - start + 1)
start = i + 1
return res
class Solution:
def partitionLabels(self, s: str) -> List[int]:
res = []
# 统计字母出现的最远位置
h = [0] * 26
for i in range(len(s)):
h[ord(s[i])-ord('a')] = i
left = 0
right = 0
for i in range(len(s)):
# 更新遍历过的字符的最远边界
right = max(right, h[ord(s[i])-ord('a')])
if i == right:
res.append(right - left + 1)
left = i + 1
return res
56. 合并区间
思路分析
按左端点从小到大排序
找到结果集的最后一个区间,若当前区间与其重合,则合并,不重合则加入结果集
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
# 按左端点从小到大排序,次序为右端点从小到大,若和下一个重合,则更新右端点
res = []
intervals.sort(key=lambda x : (x[0], x[1]))
start = intervals[0][0]
end = intervals[0][1]
for i in range(1,len(intervals)):
if intervals[i][0] <= end:
end = max(end, intervals[i][1])
else:
res.append([start, end])
start = intervals[i][0]
end = intervals[i][1]
res.append([start, end])
return res
思路清晰
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
# 按左端点从小到大排序
# 找到结果集的最后一个区间,若当前区间与其重合,则合并,不重合则加入结果集
res = []
intervals.sort(key=lambda x : x[0])
res.append(intervals[0])
for i in range(1, len(intervals)):
last = res[-1]
if last[1] >= intervals[i][0]:
res[-1] = [last[0], max(last[1], intervals[i][1])]
else:
res.append(intervals[i])
return res