ublic class Solution {
public int findMinArrowShots(int[][] points) {
//贪心思路,选取最能够射到最多气球的点射箭。
//可是要怎么找到这个点呢,很难受。
//将所有点按照起始点排序,起始点相同时按照终止点排序。
//之后只需要从开头往后遍历,找到最多能够被同时射爆的气球即可。
//怎么证明这个思路是正确的呢。
//从贪心算法的本质说起,贪心算法要求要解决的问题有贪心选择性跟最优子结构。
//假设我们找到一个能射爆气球最多的点,用这个点可以将问题分成两个子问题,这个点左边的未射爆气球所需要的最少箭数加上这个点右边未射爆
//气球的最少箭数,加1即为原问题的解。
//那么我们只要证明,通过排序后遍历所找到的点,是其中一个射爆气球最多的点即可。
//如果这个点不是射爆气球最多的点之一,那么必然能够找到另一个点,能够射爆这个点所射爆的气球,并且还能射爆其他气球,这显然是不可能的。
if(points.length == 0)
return 0;
int output = 1;
Arrays.sort(points,(x,y)->x[0] == y[0]?x[1]-y[1]:x[0]-y[0]);
int start = points[0][1];
for(int i = 1;i < points.length;i++){
if(points[i][0] <= start){
if(points[i][1]<start)
start = points[i][1];
}
else {
output++;
start = points[i][1];
}
}
return output;
}
}
public int findMinArrowShots(int[][] points) {
//贪心思路,选取最能够射到最多气球的点射箭。
//可是要怎么找到这个点呢,很难受。
//将所有点按照起始点排序,起始点相同时按照终止点排序。
//之后只需要从开头往后遍历,找到最多能够被同时射爆的气球即可。
//怎么证明这个思路是正确的呢。
//从贪心算法的本质说起,贪心算法要求要解决的问题有贪心选择性跟最优子结构。
//假设我们找到一个能射爆气球最多的点,用这个点可以将问题分成两个子问题,这个点左边的未射爆气球所需要的最少箭数加上这个点右边未射爆
//气球的最少箭数,加1即为原问题的解。
//那么我们只要证明,通过排序后遍历所找到的点,是其中一个射爆气球最多的点即可。
//如果这个点不是射爆气球最多的点之一,那么必然能够找到另一个点,能够射爆这个点所射爆的气球,并且还能射爆其他气球,这显然是不可能的。
if(points.length == 0)
return 0;
int output = 1;
Arrays.sort(points,(x,y)->x[0] == y[0]?x[1]-y[1]:x[0]-y[0]);
int start = points[0][1];
for(int i = 1;i < points.length;i++){
if(points[i][0] <= start){
if(points[i][1]<start)
start = points[i][1];
}
else {
output++;
start = points[i][1];
}
}
return output;
}
}