清单
● 435. 无重叠区间
● 763. 划分字母区间
● 56. 合并区间
LeetCode #435 无重叠区间
1. 题目
给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
注意: 可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠
2. 思路
对数组按照左边界升序进行排序,遍历数组,若当前元素的右边界大于下一元素左边界,则重叠数量+1,更新最小右边界。
3. 代码实现
class Solution:
def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
intervals.sort(key=lambda x:x[0])
num = 0
for i in range(1,len(intervals)):
if intervals[i][0] < intervals[i-1][1]:
intervals[i][1] = min(intervals[i][1],intervals[i-1][1])
num += 1
return num
LeetCode #763 划分字母区间
1. 题目
给你一个字符串 s。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。
注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s。
返回一个表示每个字符串片段的长度的列表。
2. 思路
初始思路:
根据实例,分割点为相同字母出现的最远距离处,因此需要一个字典用于记录每个字母的最远出现角标。再次遍历字符串,当遍历到的元素等同于开始元素时,记录角标至结果数组中,更新start角标,继续遍历,循环直到遍历结束
3. 代码实现
class Solution:
def partitionLabels(self, s: str) -> List[int]:
dic = {}
for i,char in enumerate(s):
dic[char] = i #如果出现相同char情况,新i值会覆盖旧i,确保字典内为最远char脚标
start = 0
end = 0
nums = []
for i,char in enumerate(s):
end = max(dic[char], end)
if i == end:
nums.append(end - start + 1) #统计切割位置脚标
start = end + 1 #更新下一次切割的初始脚标
return nums
LeetCode #56 合并区间
1. 题目
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi]。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。
2. 思路
对intervals数组按照左边界进行排序,增添一个数组用于记录不重叠的区间数组。遍历intervals数组,当满足遍历元素的左边界小于result数组最新元素的右边界时,即存在重叠区间,更新result最新元素的右边界。若不重叠则直接添加当前intervals元素至result数组中。
3. 代码实现
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
result = []
intervals.sort(key = lambda x:x[0])
result.append(intervals[0])
for i in range(1,len(intervals)):
if result[-1][1] >= intervals[i][0]:
result[-1][1] = max(intervals[i][1],result[-1][1])
else:
result.append(intervals[i])
return result