题意:大致就是这么多区间,我要用最少的箭将这些区间全部串起来,区间是水平的,箭是垂直的;
思路:对区间按照起点大小进行排序,设立max_start 和 min_end ,这样points[i+1][0]>=points[i][0]
,只要points[i+1][0]>=max_start && points[i+1][0]<=min_end
那么,下个区间就和前面的区间有交集,就可以用同一支箭串起来,并更新max_start 和 min_end,保证一只箭能串到更多的区间;如果遇到交集断开或者没有交集的,就要arrow++,并且初始化max_start和min_end,重复步骤;
用例子更好说明:
复杂度感人;
static bool cmp(vector<int> a, vector<int> b)
{
return a[0] < b[0];
}
int findMinArrowShots(vector<vector<int>> &points)
{
int len = points.size();
if (len == 0)
return 0;
sort(points.begin(), points.end(), cmp);
int max_start = points[0][0], min_end = points[0][1];
int arrow = 1;
for (int i = 1; i < len; i++)
{
//下一个区间的起点被覆盖
if (points[i][0] >= max_start && points[i][0] <= min_end)
{
//更新max_start和min_end
max_start = points[i][0];
if (points[i][1] < min_end)
{
min_end = points[i][1];
}
}
//如果下一区间的起点不被覆盖,那么需要另外一只箭去引爆
else
{
arrow++;
max_start = points[i][0];
min_end = points[i][1];
}
}
return arrow;
}