题目

在二维空间中有许多球形的气球。对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。由于它是水平的,所以纵坐标并不重要,因此只要知道开始和结束的横坐标就足够了。开始坐标总是小于结束坐标。

一支弓箭可以沿着 x 轴从不同点完全垂直地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ x ≤ xend,则该气球会被引爆。可以射出的弓箭的数量没有限制。 弓箭一旦被射出之后,可以无限地前进。我们想找到使得所有气球全部被引爆,所需的弓箭的最小数量。

给你一个数组 points ,其中 points [i] = [xstart,xend] ,返回引爆所有气球所必须射出的最小弓箭数。

示例

image.png

解题思路

这道题题目有点长,但是主要思想就是有一堆大小不一样的气球但是都水平的放在x轴上,从x轴射箭,有可能会一下射爆两个气球,这个条件注意一下,这是怎吗射爆两个气球的呢,题目中给出的条件为xstart ≤ x ≤ xend 当两个气球的坐标有啦交集,我是不是就可以射爆两个气球啦,而题目中要求的使用最少的箭射爆所有气球,如何用最少的箭射爆气球,那就是说 气球的个数 - 气球坐标交集的个数 = 射出最小的箭的数量

  1. /**
  2. * @param {number[][]} points
  3. * @return {number}
  4. */
  5. var findMinArrowShots = function (points) {
  6. if(points.length <= 1) return 1;
  7. points.sort((a, b) => a[1] - b[1]);
  8. let start = points[0][1];
  9. let total = 0;
  10. let len = points.length;
  11. for (let i = 1; i < len; i++) {
  12. if (start >= points[i][0]) {
  13. total++
  14. } else {
  15. start = points[i][1];
  16. }
  17. }
  18. return len - total;
  19. };
  20. // 该程序还可以继续优化
  21. //优化后的代码
  22. var findMinArrowShots = function (points) {
  23. if(points.length <= 1) return 1;
  24. points.sort((a, b) => a[1] - b[1]);
  25. let start = points[0][1];
  26. let total = 1;
  27. let len = points.length;
  28. for (let i = 1; i < len; i++) {
  29. const point = points[i]
  30. if (start < point[0]) {
  31. total++
  32. start = point[1];
  33. }
  34. }
  35. return total;
  36. };

另一种思路,当气球的坐标有交集,我就将数组中有交集的坐标剔除出去,最后数组的长度不就时需要最小射出的箭的数量,但是我觉得要反复改变数组会给程序运行时间增加,故而优化为上面那种方式

  1. var findMinArrowShots = function (points) {
  2. if(points.length <= 1) return 1;
  3. points.sort((a, b) => a[1] - b[1]);
  4. let start = points[0][1];
  5. for (let i = 1; i < points.length; i++) {
  6. if (start >= points[i][0]) {
  7. points.splice(i, 1)
  8. i--;
  9. } else {
  10. start = points[i][1];
  11. }
  12. }
  13. return points.length;
  14. };