3道题目
435. 无重叠区间
763. 划分字母区间
56. 合并区间
解题理解
435
跟昨天的射气球思路一样,先排序,当有重合时,确定最小右边界,确定一次计数+1。
class Solution:
def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
intervals.sort(key=lambda x: (x[0], x[1]))
res = 0
for i in range(1, len(intervals)):
if intervals[i - 1][1] > intervals[i][0]:
intervals[i][1] = min(intervals[i - 1][1], intervals[i][1])
res += 1
return res
763
自己思路进展到了每个字母的最晚出现位置,但是后面过程的细节没有把握好,结果一直不对。
class Solution:
def partitionLabels(self, s: str) -> List[int]:
dic = {}
for i, ch in enumerate(s):
dic[ch] = i
pre = cur = 0
res = []
for i, ch in enumerate(s):
cur = max(dic[ch], cur)
if cur == i:
res.append(cur - pre + 1)//+1
pre = i + 1//跟上一行同时+1才行
return res
452
很像之前的重叠区间题,但是这一次需要直接对列表末尾元素拿来找最小右边界。
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
intervals.sort(key=lambda x: (x[0], x[1]))
res = []
if len(intervals) == 0:
return res
res.append(intervals[0])
for i in range(1, len(intervals)):
if res[-1][1] >= intervals[i][0]:
res[-1][1] = max(res[-1][1], intervals[i][1])
else:
res.append(intervals[i])
return res