一位活动主持人在同一时间只能参与一个活动。并且活动主持人需要全程参与活动,换句话说,一个主持人参与了第 i 个活动,那么该主持人在 (starti,endi) 这个时间段不能参与其他任何活动。求为了成功举办这 n 个活动,最少需要多少名主持人。
数据范围: ,
复杂度要求:时间复杂度 ,空间复杂度
2,[[1,2],[2,3]]
1
只需要一个主持人就能成功举办这两个活动
2,[[1,3],[2,4]]
2
需要两个主持人才能成功举办这两个活动
在int范围内
public int minmumNumberOfHost(int n, int[][] startEnd) { // write code here if (startEnd.length <= 1) return startEnd.length; int len = startEnd.length; int[] startArr = new int[len]; int[] endArr = new int[len]; for (int i = 0; i < len; i++) { startArr[i] = startEnd[i][0]; endArr[i] = startEnd[i][1]; } Arrays.sort(startArr); Arrays.sort(endArr); int least = 1; int endIndex = 0; for (int startIndex = 1; startIndex < len; startIndex++) { // 断言没问题,勿质疑 assert startArr[startIndex] <= endArr[startIndex]; if(startArr[startIndex] >= endArr[endIndex]) endIndex ++; else least ++; } return least; }如下是正确的做法,当 startIndex < endIndex 时需要一个主持人,继续增加 startIndex, 如果仍然满足,则说明时间区间重叠,继续增加主持人,如果不满足,则说明上一个活动已经结束,可以释放一名主持人,求出这个过程中的最大的主持人数即可, while 循环保证了可以一一删除多个已经干完活儿的主持人,即使是多个end时间重叠的也是合理的
public int minmumNumberOfHost(int n, int[][] startEnd) { if (n <= 1) return n; int[] startArr = new int[n]; int[] endArr = new int[n]; for (int i = 0; i < n; i++) { startArr[i] = startEnd[i][0]; endArr[i] = startEnd[i][1]; } Arrays.sort(startArr); Arrays.sort(endArr); int maxHosts = 0; int currentHosts = 0; int startIndex = 0; int endIndex = 0; while (startIndex < n && endIndex < n) { if (startArr[startIndex] < endArr[endIndex]) { currentHosts++; startIndex++; } else { currentHosts--; endIndex++; } maxHosts = Math.max(maxHosts, currentHosts); } return maxHosts; }
public int minmumNumberOfHost (int n, int[][] startEnd) { //贪心 int[] start=new int[n]; int[] end=new int[n]; //分别获得开始/结束的时间 for(int i=0;i<n;i++){ start[i]=startEnd[i][0]; end[i]=startEnd[i][1]; } //对开始/结束时间排序 Arrays.sort(start); Arrays.sort(end); int ans=1;//主持人数初始化为1 int j=0; for(int i=1;i<n;i++){//i从1开始,而不是从0开始 if(start[i]>=end[j]){//新开始的时间>=上一个结束的时间 j++; }else{ ans++;//如果重叠了,那就主持人+1 } } return ans; }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 计算成功举办活动需要多少名主持人 * @param n int整型 有n个活动 * @param startEnd int整型二维数组 startEnd[i][0]用于表示第i个活动的开始时间,startEnd[i][1]表示第i个活动的结束时间 * @return int整型 */ public int minmumNumberOfHost (int n, ArrayList<ArrayList<Integer>> startEnd) { // write code here int[] startTime = new int[n]; int[] endTime = new int[n]; for (int i = 0; i < n; i++) { startTime[i] = startEnd.get(i).get(0); endTime[i] = startEnd.get(i).get(1); } Arrays.sort(startTime); Arrays.sort(endTime); int res = 0; int i = 0, j = 0, count = 0; while (i < n && j < n) { if (startTime[i] < endTime[j]) { count++; i++; } else if (startTime[i] > endTime[j]) { count--; j++; } else { // startTime[i] == endTime[j] i++; j++; } res = Math.max(res, count); } return res; } }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 计算成功举办活动需要多少名主持人 * @param n int整型 有n个活动 * @param startEnd int整型ArrayList<ArrayList<>> startEnd[i][0]用于表示第i个活动的开始时间,startEnd[i][1]表示第i个活动的结束时间 * @return int整型 */ public int minmumNumberOfHost (int n, ArrayList<ArrayList<Integer>> startEnd) { // write code here int[] start = new int[n]; int[] end = new int[n]; for(int i = 0; i < startEnd.size(); i++) { start[i] = startEnd.get(i).get(0); end[i] = startEnd.get(i).get(1); } Arrays.sort(start, 0, start.length); Arrays.sort(end, 0, end.length); int res = 0; int j = 0; for(int i = 0; i < n; i++){ if(start[i] >= end[j]) j++; else res++; } return res; } }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 计算成功举办活动需要多少名主持人 * @param n int整型 有n个活动 * @param startEnd int整型ArrayList<ArrayList<>> startEnd[i][0]用于表示第i个活动的开始时间,startEnd[i][1]表示第i个活动的结束时间 * @return int整型 */ public int minmumNumberOfHost (int n, int[][] startEnd) { // write code here //ArrayList<ArrayList<Integer>> int[] start=new int[n]; int[] end=new int[n]; for(int i=0;i<=n-1;i++){ // start[i]=startEnd.get(i).get(0); // end[i]=startEnd.get(i).get(1); start[i]=startEnd[i][0]; end[i]=startEnd[i][1]; } Arrays.sort(start); Arrays.sort(end); int host=1; int j=0; for(int i=1;i<=n-1;++i){ if(start[i]>=end[j]){ j++; }else{ host++; } } return host; } }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 计算成功举办活动需要多少名主持人 * @param n int整型 有n个活动 * @param startEnd int整型二维数组 startEnd[i][0]用于表示第i个活动的开始时间,startEnd[i][1]表示第i个活动的结束时间 * @return int整型 */ public int minmumNumberOfHost (int n, int[][] startEnd) { // write code here int[] start = new int[startEnd.length]; int[] end = new int[startEnd.length]; for (int i = 0; i < startEnd.length; i ++) { start[i] = startEnd[i][0]; end[i] = startEnd[i][1]; } Arrays.sort(start); Arrays.sort(end); int res = 0; int index = 0; for (int i = 0; i < startEnd.length; i ++) { if (start[i] < end[index]) { res ++; } else { index++; } } return res; } }
public int minmumNumberOfHost (int n, int[][] startEnd) { int start[]=new int[n]; int end[]=new int[n]; for(int i=0;i<n;i++){ start[i]=startEnd[i][0]; end[i]=startEnd[i][1]; } Arrays.sort(start); Arrays.sort(end); int mount=0; int ends=0; for(int i=0;i<n;i++){ if(start[i]>=end[ends]){ ends++; }else{ mount++; } } return mount; }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 计算成功举办活动需要多少名主持人 * @param n int整型 有n个活动 * @param startEnd int整型二维数组 startEnd[i][0]用于表示第i个活动的开始时间,startEnd[i][1]表示第i个活动的结束时间 * @return int整型 */ public int minmumNumberOfHost (int n, int[][] startEnd) { Arrays.sort(startEnd, (a, b) -> a[0] <= b[0] ? -1 : 1); PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>(); int ans = 0; for (int[] interval : startEnd) { while (!minHeap.isEmpty() && interval[0] >= minHeap.peek()) { minHeap.poll(); } minHeap.add(interval[1]); ans = Math.max(ans, minHeap.size()); } return ans; } }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 计算成功举办活动需要多少名主持人 * @param n int整型 有n个活动 * @param startEnd int整型二维数组 startEnd[i][0]用于表示第i个活动的开始时间,startEnd[i][1]表示第i个活动的结束时间 * @return int整型 */ public int minmumNumberOfHost (int n, int[][] startEnd) { Arrays.sort(startEnd, new Comparator<int[]>() { @Override public int compare(int[] arr1, int[] arr2) { if(arr1[0]>arr2[0]) return 1; else if(arr1[0]<arr2[0]){ return -1; } else { return arr1[1]>arr2[1]?1:-1; } } }); int res=0; PriorityQueue<Integer> deque=new PriorityQueue<>(); for(int i=0;i<n;i++){ int[]v=startEnd[i]; while (!deque.isEmpty()&&v[0]>=deque.peek()) deque.poll(); deque.offer(v[1]);//放入结束时间 res=Math.max(res,deque.size()); } return res; } }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 计算成功举办活动需要多少名主持人 * @param n int整型 有n个活动 * @param startEnd int整型二维数组 startEnd[i][0]用于表示第i个活动的开始时间,startEnd[i][1]表示第i个活动的结束时间 * @return int整型 */ public int minmumNumberOfHost (int n, int[][] startEnd) { // write code here Arrays.sort(startEnd, new Comparator<int[]>(){ @Override public int compare(int[] task1, int[] task2){ if(task1[0] != task2[0]){ return task1[0] < task2[0]? -1: 1; }else{ return task1[1] < task2[1]? -1: 1; } } }); PriorityQueue<Integer> pq = new PriorityQueue<>(); // 用于存储刚结束活动的end时间 pq.offer(startEnd[0][1]); for(int i = 1; i < n; i++){ if(startEnd[i][0] >= pq.peek()){ // 有空闲不需要增加主持人,当前主持人可以紧接着干下一个活 pq.poll(); // 把上一个活出队,当前活会入队 } pq.offer(startEnd[i][1]); // 如果跟上一个活时间重叠,就直接入队 } return pq.size(); // 队列中积压的元素数量就是需要的主持人数 } }