1. 题目
2. 思路和题解
看到这里的输入,就联想到了属于区间问题,之前遇到区间问题的时候,是将这些区间进行排序,然后再进行思考。那么在遇到这个问题的时候,第一步肯定也是先对这些区间进行排序。接下来就是排完序之后,应该如何继续思考呢?
在无重叠区间那道题,因为要求最大不重叠的区间数,所以在那道题里,选择的是区间求并集,但是在这道题目中,我们要求的是最少的箭数,其次如果箭是在这个区间当中,就可以引爆气球,所以在这里我们选择用交集来解决问题。
最后,由于要求的是交集,因此在比较的时候,当i区间的第二个元素大于i+1区间的第二个元素时,我们就需要将i+1区间放在i区间之前,当i区间的第二个元素小于i+1区间的第二个元素时,我们就需要将i+1区间放在i区间之后。
Arrays.sort(points, new Comparator<int[]>() {
public int compare(int[] point1, int[] point2) {
if (point1[1] > point2[1]) {
return 1;
} else if (point1[1] < point2[1]) {
return -1;
} else {
return 0;
}
}
});
排好序之后,就该解决箭的数量问题。首先先定义一个变量pos,将第一个区间的第二个元素的值赋给pos,然后对排序好的区间进行遍历,如果当前区间的第一个元素值小于pos,那么就说明处在交集中,箭就可以射中,如果当前区间的第一个元素大于pos,那么就说明当前这只箭的爆炸范围已经无法引爆,所以需要的箭的数量就要+1。
int pos = points[0][1];
int ans = 1;
for (int[] balloon: points) {
if (balloon[0] > pos) {
pos = balloon[1];
++ans;
}
}
所以完整的代码如下:
class Solution {
public int findMinArrowShots(int[][] points) {
if (points.length == 0) {
return 0;
}
Arrays.sort(points, new Comparator<int[]>() {
public int compare(int[] point1, int[] point2) {
if (point1[1] > point2[1]) {
return 1;
} else if (point1[1] < point2[1]) {
return -1;
} else {
return 0;
}
}
});
int pos = points[0][1];
int ans = 1;
for (int[] balloon: points) {
if (balloon[0] > pos) {
pos = balloon[1];
++ans;
}
}
return ans;
}
}