题目:无重叠区间
题解:
1)和用剑射气球很像,但是注意排序的时候应该用右区间排序。
代码:
class Solution(object):
def eraseOverlapIntervals(self, intervals):
"""
:type intervals: List[List[int]]
:rtype: int
"""
res = 0
if not intervals:
return res
intervals.sort(key = lambda x:x[1])#这个很重要,是按照右区间进行排序,才能够根据有右区间比较左区间来判断是否重合
print(intervals)
temp = intervals[0][1]
for i in intervals[1:]:
if i[0] < temp:
res += 1
else:
temp = i[1]
return res
题目:合并区间
题解:
注意两个点:
1)本题要根据左端点来排序,因为这样合并的子区间一定是连续的(本题有一个特殊样例:【3,4】,【5,6】,【7,8】,【1,10】)这样如果按照右边界一定是不正确的,因为还需要回溯。按照左边界就会避免这个问题
2)注意如果已经进入result的区间和下一个区间有重合,那么需要重新赋值result中的最后一个元素。
代码:
result = []
if not intervals:
return result
intervals.sort(key = lambda x:x[0])#这次按照左边界来排序
result.append(intervals[0])
for i in intervals[1:]:
temp = result[-1]
if i[0] <= temp[1]:
result[-1] = [temp[0], max(temp[1], i[1])]#当下一个数据和上一个已经存进result数组的元素有重叠,需要重新赋值
else:
result.append(i)
return result
题目:划分字母区间
题解:
1)遍历两次数组,第一次收集所有字母的最远下标
2)第二次遍历统计之前出现过所有字母的最远距离,如果最远距离和当前遍历到的位置相同,那么就是下一个字符串要切割的位置。
代码:
class Solution(object):
def partitionLabels(self, s):
"""
:type s: str
:rtype: List[int]
"""
num = {}
for i in range(len(s)):
num[s[i]] = i
left = 0
right = 0
res = []
for i in range(len(s)):
right = max(right, num[s[i]])
if right == i:
res.append(right - left + 1)
left = i + 1
return res