标签:vector shot LeetCode452 start points end 引爆 气球 贪心
实现思路
实际上每一个气球至少需要一个弓箭手,那么这个弓箭手在射击的时候需要贪心的尽可能的多射击气球。说明这道题可以使用贪心的策略来求解,做了这几道题综合观察确实贪心一般都是线性的,也就意味着在求解的时候可以从头遍历到尾基本在这个过程中就可以得到问题的解了。
具体在代码的实现的过程中,先把所有数据按照start的值升序排序,end的值先不用管,在后序会处理。这个过程中,取区间的交集,不能取到交集的情况下说明需要新分配一个弓箭手。
实现代码
bool cmp(const vector<int> &a,const vector<int> &b){
return a[0]<b[0];
}
class Solution {
public:
int findMinArrowShots(vector<vector<int>>& points) {
int n=points.size();
if(n<2) return n;
int shot_num=1;
sort(points.begin(),points.end(),cmp);
int shot_start=points[0][0],shot_end=points[0][1];
for(int i=1;i<n;i++){
if(points[i][0]<=shot_end){
shot_start=points[i][0];
if(points[i][1]<shot_end){
shot_end=points[i][1];
}
}
else{
shot_num++;
shot_start=points[i][0];
shot_end=points[i][1];
}
}
return shot_num;
}
};
代码这里需要多说明的一点,要注意两个区间start相等的情况也是要处理,这样才能下一步来比较end的值
提交结果及分析
时间复杂度O(n)
注意问题
这里面利用了C++的中的sort,但是想要特殊类型的需要自己实现返回值为bool类型的cmp函数,注意这个函数需要时static类型的,最简单就是将其定义在类的外部即可
标签:vector,shot,LeetCode452,start,points,end,引爆,气球,贪心 来源: https://blog.csdn.net/weixin_44944046/article/details/113785964
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。