在二维空间中有许多球形的气球。对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。由于它是水平的,所以纵坐标并不重要,因此只要知道开始和结束的横坐标就足够了。开始坐标总是小于结束坐标。
一支弓箭可以沿着 x 轴从不同点完全垂直地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ x ≤ xend,则该气球会被引爆。可以射出的弓箭的数量没有限制。 弓箭一旦被射出之后,可以无限地前进。我们想找到使得所有气球全部被引爆,所需的弓箭的最小数量。
给你一个数组 points ,其中 points [i] = [xstart,xend] ,返回引爆所有气球所必须射出的最小弓箭数。
我的解法:首先按照区间的右边界从小到大排序区间,然后以区间的右边界为弓箭射出的坐标cur,若cur大于等于point[i][0],说明当前箭可以引爆第i个气球;若cur小于point[j][0],说明当前箭无法引爆第j个气球,则将总箭数+1,并将point[j][1]作为下一支箭射出的坐标,继续判断直到所有区间都判断完。
时间复杂度:O(n),空间复杂度:O(1)
class Solution {
public int findMinArrowShots(int[][] points) {
if (points.length == 0) {
return 0;
}
int len = points.length, res = 1;
/*按右边界从小到大排序数组*/
Arrays.sort(points, (o1, o2) -> {
return o1[1] > o2[1] ? 1 : -1;
});
/*第一支箭(箭的位置只可能出现在区间的右边界)*/
int cur = points[0][1];
for (int i = 1; i < len; i++) {
/*若cur小于point[i][0]说明当前箭无法引爆第i个气球*/
if (cur < points[i][0]) {
res += 1;
cur = points[i][1];
}
}
return res;
}
}