题解 | #主持人调度(二)# 贪心+排序+TreeMap
主持人调度(二)
https://www.nowcoder.com/practice/4edf6e6d01554870a12f218c94e8a299
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 // 记录主持人的结束时间,因为需要考虑到多个主持人结束时间相同,不能使用Set-->Map TreeMap<Integer,Integer> map = new TreeMap<>(); // sort by startTime // 如果用a[0]-b[0],当正数减负数(2147483646,-2147483648)会溢出 // 即Arrays.sort(startEnd,(a,b)->a[0]-b[0]);会排序错误 // 需要用compare Arrays.sort(startEnd,(a,b)->Integer.compare(a[0],b[0])); // check // System.out.println(Arrays.deepToString(startEnd)); for(int i=0;i<n;i++){ int start = startEnd[i][0],end = startEnd[i][1]; // 找到一个在start时刻前空闲的主持人 // floor是找到小于或等于键值的最大值 Map.Entry<Integer,Integer> entry= map.floorEntry(start); if(entry!=null){ if(entry.getValue()==1){ map.remove(entry.getKey()); }else{ map.put(entry.getKey(),entry.getValue()-1); } } map.put(end,map.getOrDefault(end,0)+1); } int res = 0; for(Map.Entry<Integer,Integer> entry:map.entrySet()){ res += entry.getValue(); } return res; } }
input :10,[[2147483646,2147483647],[-2147483648,-2147483647],[2147483646,2147483647],[-2147483648,-2147483647],[2147483646,2147483647],[-2147483648,-2147483647],[2147483646,2147483647],[-2147483648,-2147483647],[2147483646,2147483647],[-2147483648,-2147483647]]
output: 5
踩坑点:如果不使用Arrays.sort(startEnd,(a,b)->Integer.compare(a[0],b[0]));对活动开始时间排序,而使用a[0]-b[0],以上样例,当正数减负数(2147483646,-2147483648,)会溢出,使得排序结果错误,output 10
#算法笔记#