思路一:
● 对数组进行排序,如果区间开始下标相同,按区间结束下标从小到大排序,否则按区间开始下标排序
● 使用最小堆来获取最近最快结束的区间结束下标
import java.util.*; public class Solution { public int minmumNumberOfHost (int n, int[][] startEnd) { //如果开始时间相同,按结束时间从小到大排序,否则按开始时间排序 Arrays.sort(startEnd, new Comparator<int[]>() { @Override public int compare(int[] o1, int[] o2) { if (o1[0] == o2[0]) { return Integer.compare(o1[1], o2[1]); } else { return Integer.compare(o1[0], o2[0]); } } }); // 使用最小堆来获取最近最快结束的活动结束时间 PriorityQueue<Integer> minHeap = new PriorityQueue<>(); for (int i = 0; i < n; i++) { int start = startEnd[i][0]; int end = startEnd[i][1]; if (minHeap.isEmpty()) { minHeap.add(end); } else if (minHeap.peek() <= start) { //如果当前开始时间大于等于之前某个活动的结束时间,说明可以让之前那个主持人继续主持当前的活动 minHeap.poll(); minHeap.add(end); } else { // 如果不满足,需要新派一个主持人 minHeap.add(end); } } return minHeap.size(); } }
思路二:
● 使用两个数组,分别记录开始下标和结束下标,并对两个数组从小到大进行排序
● 遍历n个区间,如果某个区间开始下标大于之前之前区间结束的下标,则划分为同一组,无需增加新的分组
● 如果出现之前的区间的结束下标大于当前区间开始下标,则需要增加新的一组
import java.util.*; public class Solution { public int minmumNumberOfHost (int n, int[][] startEnd) { if (n == 0) { return 0; } int[] starts = new int[n]; int[] ends = new int[n]; for (int i = 0; i < n; i++) { starts[i] = startEnd[i][0]; ends[i] = startEnd[i][1]; } Arrays.sort(starts); Arrays.sort(ends); // 如果某个活动开始的时间大于之前活动结束的时候,不增加主持人 // 若是出现之前活动结束时间晚于当前活动开始时间的,则需要增加主持人。 int res = 0; int j = 0; for (int i = 0; i < n; i++) { if (starts[i] >= ends[j]) { j++; } else { res++; } } return res; } }