代码随想录算法训练营day30| 452. 用最少数量的箭引爆气球 435. 无重叠区间 763.划分字母区间
学习资料:https://programmercarl.com/0452.用最少数量的箭引爆气球.html
重叠区域问题
最远位置问题
452.用最少数量的箭引爆气球(重叠区域;按左边界排序;i区间的左边界与i-1区间的右边界比较来确定是否重叠;更新i的右边界,取i与i-1区域右边界的最小值)
点击查看代码
class Solution(object):
def findMinArrowShots(self, points):
"""
:type points: List[List[int]]
:rtype: int
"""
# 贪心:尽量让重叠部分被一根箭射爆,难点在于怎么处理重叠部分
# 当没有气球就不需要箭
if not points:
return 0
# 按照每个位置气球的左边界进行排序,方便后续重叠部分处理
points.sort(key=lambda x:x[0])
# 至少一根箭
min_num = 1
# 开始遍历每个位置
for i in range(1, len(points)):
# 用该位置的左边界和上一个位置的右边界的大小来判断是否有重叠。如果无重叠,那必然加一根箭
if points[i][0] > points[i-1][1]:
min_num += 1
# 如果有重叠,要根据前后位置的各自的右边界的大小来更新当前位置的右边界。取较小的右边界,方便后面循环若还有重叠部分,判断是否为三重叠,还是仅为两重叠
else:
points[i][1] = min(points[i][1], points[i-1][1])
return min_num
435.无重叠区间(求重叠的个数,就是要删除的区间个数)
点击查看代码
class Solution(object):
def eraseOverlapIntervals(self, intervals):
"""
:type intervals: List[List[int]]
:rtype: int
"""
# 贪心:题目要通过删除部分区间来实现无重叠,那我只需要求出现在区间的重叠个数,这个个数就是要删除的区间个数
count = 0
intervals.sort(key=lambda x:x[0]) # 对区间集合按左边界排序
for i in range(1, len(intervals)):
if intervals[i][0] >= intervals[i-1][1]: # 无重叠,不操作
pass
else:
count += 1
intervals[i][1] = min(intervals[i][1], intervals[i-1][1]) # 为了判断i+1与(i-1,i)的重叠,需要更新i的右边界,使得该值是i-1与i的较小值
return count
763.划分字母区间(妙哉,统计同一个字母的最远索引;向后迭代如果该字母的最远索引超过前一个的就更新最远索引,一直到遍历位置等于最远索引时,获取这一段字母,后续更新left,继续找下一段字母)
点击查看代码
class Solution(object):
def partitionLabels(self, s):
"""
:type s: str
:rtype: List[int]
"""
# 找到每种字母的最远位置(字母,最远索引)
hashdict = {}
for i in range(len(s)):
hashdict[s[i]] = i
# 左指针是这一片段的起点,不断向后遍历,及时更新右指针为最远索引,一直到遍历到了(i追上right)右指针,则获得一个片段
result = []
left = 0
right = 0
for i in range(len(s)):
right = max(right, hashdict[s[i]]) # 当遍历到一个新元素时,该元素的最远指针与前面的不同,要选择更远的指针
if i == right:
result.append(right-left+1) # 计算片段长度
left = i+1 # 左指针更新
return result
PS:今天阴得很,居然没下雨,吃了很多快餐,煎饼、杂酱面、饭团、包子
今天是day30了耶,虽然很累但是还是很快,但是还是很累只剩一半了,越学越轻松了感觉
不想面试,不想测试,感觉自己好菜
浙公网安备 33010602011771号