题目描述:
解题思路:
1、 一开始做这道题,我思路想错了,以为是合并区间后,然后看还有多少个区间就是答案。其实这道题不是这样的。因为前面如果按照合并区间后,可能出现几个区间需要多个子弹射击才能符合条件,但是由于前面吧区间合并了,所有最后计算的时候也会出错。
这道题正确的做法,是按照右端端点升序排序后利用贪心。
重点是要理解为什么用右端排序。
2、 右端升序排序后,第一个区间的结束位置和下一个区间的开始位置比较,如果比下一个区间小的话,说明两个区间不连续,无法做到一个子弹射击掉,所有count++,然后根据贪心,更新到下一个区间结束的位置(大的),开始时候是最理想的情况,所有都连一块,可以一发子弹射击掉所有的气球,count初始值设置为1。
3、 这道题还有个坑,一开始我写的Lambda表达式,让o1-o2,排序出错了,是由于题目给的一个数据
[[-2147483646,-2147483645],[2147483646,2147483647]]
,在减的时候会溢出,所有要使用Integer.compare(o1[1],o2[1])
参考代码:
public int findMinArrowShots(int[][] points) {
Arrays.sort(points,(o1,o2)->Integer.compare(o1[1],o2[1]));
int[][] arr = new int[points.length][2];
int a=points[0][1];
int count=1;
for (int i = 1; i < points.length; i++) {
if(a<points[i][0])
{
count++;
a=points[i][1];
}
}
return count;
}