力扣452:用最少数量的箭射爆气球(排序+贪心)
452. 用最少数量的箭引爆气球 - 力扣(LeetCode)
从简单情况入手:如果只有两个区间,则只要这两个区间有公共部分,就只需用一只箭可以射穿。如果现在加入第三个区间,为了方便看是否有公共部分,可以先将其按照左端点大小排序。如果第三个区间的左端点比前两个区间的公共部分的右端点要小,那么不需要增加新的箭。反之就需要增加新的箭。前两个区间公共部分的右端点就是这两个区间右端点的最小值。
现在思路很清晰了。只需遍历每个区间,看这个区间的左端点比前面所有区间的公共部分的右端点(即最小右端点)大或者小即可。同时维护公共部分的右端点。
class Solution
{
public:int findMinArrowShots(vector<vector<int>>& points) {if(points.size()==0) return 0;sort(points.begin(),points.end(),[](const vector<int>&a,const vector<int>&b){return a[0]<b[0];});//按照左端点排序int res=1;//至少需要1支箭for(int i=1;i<points.size();i++){if(points[i][0]>points[i-1][1])//如果区间左端点比前面的最小右端点要大,则需要新的箭{res++;}else{points[i][1]=min(points[i][1],points[i-1][1]);//否则,更新最小右端点}}return res;}
};