452. 用最少数量的箭引爆气球
贪心
import java.util.Arrays;
import java.util.Comparator;
import java.util.LinkedList;
class Solution {
public int findMinArrowShots(int[][] points) {
/**
* 对数组排序,按照从小到大的区间
*/
Arrays.sort(points, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0] - o2[0];
}
});
/**
* 将区间放进列表。如果遇到重复的区间,就取交集,否则直接加进来
* 最后列表的长度就是答案
*/
LinkedList<int[]> list = new LinkedList<>();
for (int[] arr : points){
if (list.isEmpty()){
list.add(arr);
}
else {
int[] temp = list.getLast();
if (arr[0] > temp[1] || arr[1] < temp[0]){
list.add(arr);
}
else {
list.removeLast();
list.add(new int[]{Math.max(arr[0], temp[0]), Math.min(arr[1], temp[1])});
}
}
}
return list.size();
}
}
/**
* 时间复杂度 O(nlogn)
* 空间复杂度 O(n)
*/
优化1——不用额外空间记录
import java.util.Arrays;
import java.util.Comparator;
class Solution {
public int findMinArrowShots(int[][] points) {
/**
* 对数组排序,按照从小到大的区间
* 元素值可能会溢出,使用Integer.compare()方法进行比较
*/
Arrays.sort(points, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return Integer.compare(o1[0], o2[0]);
}
});
int count = 1;
/**
* 如果后一个区间和前一个区间不重叠,count加1
* 否则更新这个区间的右边界,取最小值
*/
for (int i = 1; i < points.length; i++) {
if (points[i][0] > points[i - 1][1]){
count++;
}
else {
points[i][1] = Math.min(points[i][1], points[i - 1][1]);
}
}
return count;
}
}
/**
* 时间复杂度 O(nlogn)
* 空间复杂度 O(1)
*/
https://leetcode-cn.com/problems/minimum-number-of-arrows-to-burst-balloons/