代码随想录算法训练营Day 36|贪心算法 part05|435. 无重叠区间、763.划分字母区间、56. 合并区间
文章目录
435. 无重叠区间
一、贪心 把452.用最少数量的箭引爆气球代码稍做修改
class Solution(object):
def eraseOverlapIntervals(self, intervals):
"""
:type intervals: List[List[int]]
:rtype: int
"""
intervals.sort(key=lambda x:x[0])
result =1 # 不重叠区间数量,初始化为1,因为至少有一个不重叠的区间
for i in range(len(intervals)-1):
if intervals[i][1]<=intervals[i+1][0]: # 没有重叠
result +=1
else:# 重叠情况
intervals[i+1][1]=min(intervals[i+1][1],intervals[i][1])
return len(intervals)-result
二、贪心 直接统计重叠区间数量
class Solution(object):
def eraseOverlapIntervals(self, intervals):
"""
:type intervals: List[List[int]]
:rtype: int
"""
intervals.sort(key=lambda x:x[0])
count =0
for i in range(len(intervals)-1):
if intervals[i][1]>intervals[i+1][0]:
intervals[i+1][1]=min(intervals[i][1],intervals[i+1][1])
count +=1
return count
763.划分字母区间
一、贪心(好像也不像贪心)
class Solution(object):
def partitionLabels(self, s):
"""
:type s: str
:rtype: List[int]
"""
map = collections.defaultdict(int)
result=[]
start=0
end=0
for i in range(len(s)):
map[s[i]] = i
# print(map)
for i in range(len(s)):
end = max(end,map[s[i]]) # 找到当前字符出现的最远位置
if i == end: # 如果当前位置是最远位置,表示可以分割出一个区间
result.append(end-start+1)
start=i+1
return result
在遍历的过程中相当于是要找每一个字母的边界,如果找到之前遍历过的所有字母的最远边界,说明这个边界就是分割点了。此时前面出现过所有字母,最远也就到这个边界了。
可以分为如下两步:
统计每一个字符最后出现的位置
从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点
56. 合并区间
一、贪心
class Solution(object):
def merge(self, intervals):
"""
:type intervals: List[List[int]]
:rtype: List[List[int]]
"""
intervals.sort(key=lambda x:x[0])
if len(intervals)==0:return []
result = [intervals[0]]
start=0
end =0
for i in range(1,len(intervals)):
if result[-1][1]>=intervals[i][0]:
# 合并区间,只需要更新结果集最后一个区间的右边界,因为根据排序,左边界已经是最小的
result[-1][1] = max(result[-1][1],intervals[i][1])
else:
result.append(intervals[i])
return result