435.无重叠区间
思路:
intervals = [ [1,2], [3,6], [7,12], [4,8], [10,16]]
[1,2]
[3 |6]
[4 | 8]
[7 | 12]
[|10 16]
按照x[0]排序
class Solution:
def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
count = 1
intervals = sorted(intervals,key = lambda x:x[0])
for i in range(1,len(intervals)):
if intervals[i][0] >= intervals[i-1][1]:
count += 1
else:
intervals[i][1] = min(intervals[i-1][1],intervals[i][1])
return len(intervals)-count
按x[1]排序
class Solution:
def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
count = 1
intervals = sorted(intervals,key = lambda x:x[1])
end = intervals[0][1]
for i in range(1,len(intervals)):
if end <= intervals[i][0]:
count += 1
end = intervals[i][1]
return len(intervals)-count
763.划分字母区间
思路:
1.从头开始遍历字符串,遍历同时维护当前片段的开始位置 start 和结束位置 end。
2.对于字符串中的每个字符s[i],得到当前字母的最后一次出现的下标位置 letter_map[s[i]],则当前片段的结束位置一定不会早于 letter_map[s[i]],所以更新 end 值为 end = max(end,letter_map[s[i]])。
3.当i == end时,当前片段访问结束,当前片段的下标范围为[start,end],长度为end-start+1,将其长度加入答案数组,并更新 start 值为i+1,继续遍历。
4.最终返回答案数组。
class Solution:
def partitionLabels(self, s: str) -> List[int]:
letter_map = dict()
for i in range(len(s)):
letter_map[s[i]] = i
res = []
start, end = 0, 0
for i in range(len(s)):
end = max(end,letter_map[s[i]])
if i == end:
res.append(end - start + 1)
start = i + 1
return res
56.合并区间
思路:
1.先按首位置进行排序
2.定义res,当res为空时,及第一个区间,直接加入
3.判断区间是否重叠:
- 区间起点小于前一个区间终点 res[- 1] [ 1 ]< interval[0],不重叠加入res
- 重叠时,判断当前区间终点与前一个区间终点,取最大值,赋值给前一个区间终点,res[- 1] [1] = max(res[- 1] [1] ,interval[1])
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
intervals.sort(key = lambda x: x[0])
res = []
for interval in intervals:
# 如果列表为空,或者当前区间与上一区间不重合,直接添加
if not res or res[-1][1]< interval[0]:
res.append(interval)
else:
# 否则与上一区间进行合并
res[-1][1] = max(res[-1][1],interval[1])
return res