题目
在二维空间中有许多球形的气球。对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。由于它是水平的,所以纵坐标并不重要,因此只要知道开始和结束的横坐标就足够了。开始坐标总是小于结束坐标。
一支弓箭可以沿着 x 轴从不同点完全垂直地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ x ≤ xend,则该气球会被引爆。可以射出的弓箭的数量没有限制。 弓箭一旦被射出之后,可以无限地前进。我们想找到使得所有气球全部被引爆,所需的弓箭的最小数量。
给你一个数组 points ,其中 points [i] = [xstart,xend] ,返回引爆所有气球所必须射出的最小弓箭数。
示例
解题思路
这道题题目有点长,但是主要思想就是有一堆大小不一样的气球但是都水平的放在x轴上,从x轴射箭,有可能会一下射爆两个气球,这个条件注意一下,这是怎吗射爆两个气球的呢,题目中给出的条件为xstart ≤ x ≤ xend 当两个气球的坐标有啦交集,我是不是就可以射爆两个气球啦,而题目中要求的使用最少的箭射爆所有气球,如何用最少的箭射爆气球,那就是说 气球的个数 - 气球坐标交集的个数 = 射出最小的箭的数量
/**
* @param {number[][]} points
* @return {number}
*/
var findMinArrowShots = function (points) {
if(points.length <= 1) return 1;
points.sort((a, b) => a[1] - b[1]);
let start = points[0][1];
let total = 0;
let len = points.length;
for (let i = 1; i < len; i++) {
if (start >= points[i][0]) {
total++
} else {
start = points[i][1];
}
}
return len - total;
};
// 该程序还可以继续优化
//优化后的代码
var findMinArrowShots = function (points) {
if(points.length <= 1) return 1;
points.sort((a, b) => a[1] - b[1]);
let start = points[0][1];
let total = 1;
let len = points.length;
for (let i = 1; i < len; i++) {
const point = points[i]
if (start < point[0]) {
total++
start = point[1];
}
}
return total;
};
另一种思路,当气球的坐标有交集,我就将数组中有交集的坐标剔除出去,最后数组的长度不就时需要最小射出的箭的数量,但是我觉得要反复改变数组会给程序运行时间增加,故而优化为上面那种方式
var findMinArrowShots = function (points) {
if(points.length <= 1) return 1;
points.sort((a, b) => a[1] - b[1]);
let start = points[0][1];
for (let i = 1; i < points.length; i++) {
if (start >= points[i][0]) {
points.splice(i, 1)
i--;
} else {
start = points[i][1];
}
}
return points.length;
};