题解 | #主持人调度(二)# 贪心+排序+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
#算法笔记#
查看7道真题和解析