今天题还是需要把逻辑弄清楚
56. Merge Intervals
这道题的关键在于如何判断重叠
Way1:
新建一个最终结果的array,每次取array的最后一个[x,y]中的与遍历数组的x去比较,如果前者比后者大,则进行merge,否则直接存入array
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
intervals.sort(key=lambda x:x[0])
res=[]
for x in intervals:
if not res or x[0]>res[-1][1]:
res.append(x)
else:
res[-1][1]=max(res[-1][1],x[1])
return res
763. Partition Labels
这道题的关键在于如果进行分段,基本方法就是利用两次遍历
Way1:
第一次遍历得到每个字母的最后一次出现的时机,第二次遍历判断当前是不是target字母的最后一次出现,如果是则从l到r这一段就是符合要求的一段,算长度并且重置l为i+1
class Solution:
def partitionLabels(self, s: str) -> List[int]:
dic={}
for i in range(len(s)):
dic[s[i]]=i
res=[]
right=0
left=0
for i in range(len(s)):
right=max(right,dic[s[i]])
if i==right:
res.append(right-left+1)
left=i+1
return res
435. Non-overlapping Intervals
这道题相对复杂一些,主要逻辑就是把去重叠变成找端点
Way1:
对[x,y]按照y排序,然后判断有多少个重复,最终答案就是len(interval)-重复数
class Solution:
def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
intervals.sort(key=lambda x: (x[1]))
res=1
end=intervals[0][1]
for i in range(1,len(intervals)):
if end<=intervals[i][0]:
res+=1
end=intervals[i][1]
return len(intervals)-res
Way2
这种方法是对对[x,y]中的x排序。然后直接求有多少个非重叠。如果每次是重叠的则当前的y等于当前的y,否则非重叠+1并且找y的最小值
class Solution:
def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
intervals.sort(key=lambda x: (x[0]))
res=0
end=intervals[0][1]
for i in range(1,len(intervals)):
if end<=intervals[i][0]:
end=intervals[i][1]
else:
res+=1
end=min(end,intervals[i][1])
return res