解题思路:
该题使用贪心的思想来获取局部最优解
首先对原始区间数组按照每个区间的第一个元素(start)来进行排序。
创建一个List用于存储遍历后的区间,先将排序后的数组的第一个元素加入到List中,之后开始遍历数组。如果第二个区间的start大于第一个区间的end,则证明两个区间不重叠,直接将当前区间加入到List中,如果第二个区间的start小于或等于第一个区间的end,那么两个区间重叠,此时将两个区间合并,合并后的区间的start为第一个区间的start,end为两个区间的最小end,再将合并后的区间加入到List中。
最终遍历结束后,List的size即为所需要的最小弓箭数量。
代码实现:
public int findMinArrowShots(int[][] points) {
List<int[]> pointsList=new ArrayList<>();
//先对原始数组按照第一个元素进行排序
Arrays.sort(points, Comparator.comparingInt(p -> p[0]));
pointsList.add(points[0]);
for(int i=1;i<points.length;i++)
{
//如果下一个区间的start小于上一个区间的end,则证明两个区间重叠
if(points[i][0]<=pointsList.get(pointsList.size()-1)[1])
{
//两个区间重叠,需要合并,合并后的新区间的end为两个区间最小的end
pointsList.get(pointsList.size()-1)[1]=Math.min(pointsList.get(pointsList.size()-1)[1],points[i][1]);
}
else
{
//不重叠,直接添加
pointsList.add(points[i]);
}
}
return pointsList.size();
}