思路一:
● 对数组进行排序,如果区间开始下标相同,按区间结束下标从小到大排序,否则按区间开始下标排序
● 使用最小堆来获取最近最快结束的区间结束下标
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;
}
}

京公网安备 11010502036488号