public class Solution {
public int findMinArrowShots(int[][] points) {
if (points == null || points.length < 1 || points[0].length < 1) return 0;
Arrays.sort (points, new Comparator<int[]>() {
public int compare(int[] a, int[] b) {
if (a[0] == b[0]) return a[1] - b [1];
return a[0] - b[0];
}
});
int count = 1;
int limited = points[0][1];
for (int i = 0; i < points.length; i++) {
int[] cur = points[i];
if (cur[0] <= limited) {
limited = Math.min(limited, cur[1]);
} else {
count++;
limited = cur[1];
}
}
return count;
}
}
public class Solution {
public int findMinArrowShots(int[][] points) {
//This is obviously greedy problem
//So we need to fire the first arrow such that it bursts as many as possible
//which means we need to sort them in the increasing order of X-end
//So the first arrow needs to be fired at the first balloon's X-end (beyond that the first would not burst)
//So the second arrow needs to be fired only if we encounter a balloon which is starting beyond this X-end
//We ll have to fire the second one on that one's X-end and so on
//Base case
if(points == null || points.length == 0) { //Empty balloons require zero arrows
return 0;
}
//Sort the balloons in increasing order of X-end
Arrays.sort(points, new Comparator<int[]>() {
public int compare(int[] a, int[] b) {
return a[1]==b[1] ? a[0]-b[0] : a[1] - b[1];
}
});
//Initially arrow_count is 1
int arrow_count = 1;
//The first arrow needs to be shot at the first balloon's X-end
int arrow_position = points[0][1];
//Iterate thro' the rest of the balloons and fire an arrow only if that balloon's start is beyond the arrow position
for(int i=1; i<points.length; i++) {
if(points[i][0] > arrow_position) {
arrow_count++; //one more arrow needs to be fired
arrow_position = points[i][1]; //needs to be fired at that balloon's X-end
}
}
return arrow_count;
}
}