您现在的位置是:首页 >技术交流 >代码随想录算法训练营第三十五天| 贪心算法04网站首页技术交流
代码随想录算法训练营第三十五天| 贪心算法04
简介代码随想录算法训练营第三十五天| 贪心算法04
452. 用最少数量的箭引爆气球
重叠区间问题,注意点:
1. 只要points长度不为0,那么至少是需要一只箭的,所以result初始值为1
2. 排序后,如果当前元素第一个值比前一个元素最后一个值小,那么说明不在一个区间里
3. 在相同区间里的话,需要选择最短尾端
class Solution:
def findMinArrowShots(self, points: List[List[int]]) -> int:
if len(points)==0:return 0
result=1
points.sort(key=lambda x:x[0])
for i in range(1,len(points)):
if points[i][0]>points[i-1][1]:
result+=1
else:
points[i][1]=min(points[i][1],points[i-1][1])
return result
435. 无重叠区间
由上一题改进,注意点:
1. 排序按左边界排,判断时则只需要判断当前元素的左边界是否大于等于前一元素的右边界,若为真,则不重叠
2. 若重叠,则右边界取最小值,这样可以得到最大重叠区间数
class Solution:
def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
if len(intervals)==0:return 0
intervals.sort(key=lambda x:x[0])
n=len(intervals)
result=1
for i in range(1,n):
if intervals[i-1][1]<=intervals[i][0]:
result+=1
else:
intervals[i][1]=min(intervals[i-1][1],intervals[i][1])
return n-result
763.划分字母区间
注意点:
1. 遍历一遍,确定每个字母的最后位置
2. 若到达最远位置,则划分出一个区间
class Solution:
def partitionLabels(self, s: str) -> List[int]:
last_occurred={}
for i,ch in enumerate(s):
last_occurred[ch]=i
result=[]
start=end=0
for i,ch in enumerate(s):
end=max(end,last_occurred[ch])
if i==end:
result.append(end-start+1)
start=i+1
return result
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。





U8W/U8W-Mini使用与常见问题解决
QT多线程的5种用法,通过使用线程解决UI主界面的耗时操作代码,防止界面卡死。...
stm32使用HAL库配置串口中断收发数据(保姆级教程)
分享几个国内免费的ChatGPT镜像网址(亲测有效)
Allegro16.6差分等长设置及走线总结