无重叠区间
题目链接:无重叠区间
就是保持右边界不变,然后慢慢移除。
class Solution(object):
def eraseOverlapIntervals(self, intervals):
"""
:type intervals: List[List[int]]
:rtype: int
"""
intervals.sort(key=lambda x:x[0])
#第一个天生不需要移除
count=1
#更新右边界
right=intervals[0][1]
n=len(intervals)
for i in range(1,n):
if intervals[i][0]>=right:
count+=1
right=intervals[i][1]
else:
right=min(right,intervals[i][1])
return n-count
56. 合并区间
题目链接:56. 合并区间
思路
- 按照左边的排列,所以左区间一定是最小边界
- 将第一个数输入,然后比较,接下来的数字,右边界为最大值。
- 没有重合即加入数组
class Solution(object):
def merge(self, intervals):
"""
:type intervals: List[List[int]]
:rtype: List[List[int]]
"""
if len(intervals) == 0: return intervals
intervals.sort(key=lambda x: x[0])
result = []
result.append(intervals[0])
for i in range(1, len(intervals)):
last = result[-1]
if last[1] >= intervals[i][0]:
result[-1] = [last[0], max(last[1], intervals[i][1])]
else:
result.append(intervals[i])
return result
763. 划分字母区间
题目链接:763. 划分字母区间
思路
本题目的关键就是首位不重复
- 用字典记录字母最后一个出现的位置
- 然后遍历,不断更新最后出现的位置,当i等于最后出现的位置时就是分割点。
class Solution(object):
def partitionLabels(self, s):
"""
:type s: str
:rtype: List[int]
"""
ans=[]
dic={}
last_piece = -1 #上一段字符最后出现位置
end_piece = 0 #当前段字符最后出现位置
#记录每个字母最后出现的位置
for i in range(len(s)):
dic[s[i]]=i
for i in range(len(s)):
if end_piece>=i and end_piece< dic[s[i]]:
end_piece=dic[s[i]]
# 如果当前位置i走到end_piece了,那么是一次可能的划分位置,
# 判断当前字符在字典中的位置是不是小于end_piece
if i == end_piece :
ans.append(end_piece - last_piece)
last_piece = end_piece
end_piece += 1
return ans