代码随想录算法训练营第三十六天|435. 无重叠区间,763.划分字母区间,56. 合并区间
435. 无重叠区间
题目链接:无重叠区间
还在想删除要删除谁,有点卡住了,但其实无所谓,把边界改成小的那个就行。
class Solution:
def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
intervals.sort(key=lambda x:x[0])
res = 0
for i in range(1,len(intervals)):
if intervals[i][0] < intervals[i-1][1]:
res += 1
intervals[i][1] = min(intervals[i][1],intervals[i-1][1])
return res
763.划分字母区间
题目链接:划分字母区间
收集一下字母的区间,然后做合并区间。
class Solution:
def partitionLabels(self, s: str) -> List[int]:
d = defaultdict(list)
for i in range(len(s)):
if d[s[i]] == []:
d[s[i]].append(i)
d[s[i]].append(i)
else:
d[s[i]][1] = i
sorted(d.values(),key=lambda x:x[0])
intervals = []
for i in d:
intervals.append(d[i])
res = []
for i in range(1,len(intervals)):
if intervals[i][0] == (intervals[i-1][1]+1):
res.append(intervals[i-1][1]-intervals[i-1][0]+1)
else:
intervals[i][0] = intervals[i-1][0]
intervals[i][1] = max(intervals[i-1][1],intervals[i][1])
res.append(intervals[-1][1]-intervals[-1][0]+1)
return res
56. 合并区间
题目链接:合并区间
还是先按第一个维度排序,当前区间的左区间小于等于右区间的,就说明重叠了,那就更新当前区间,如果大于的,就说明重叠区间结束了,那就把上一个已经合并的大区间加到结果集里去。
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
intervals.sort(key=lambda x:x[0])
#print(intervals)
res = []
for i in range(1,len(intervals)):
if intervals[i][0] > intervals[i-1][1]:
res.append(intervals[i-1])
else:
intervals[i][0] = intervals[i-1][0]
intervals[i][1] = max(intervals[i][1],intervals[i-1][1])
res.append(intervals[-1])
return res