题解 | 主持人调度(二)这个题也非常有灵性 注意lambda表达式 sort的重载。
主持人调度(二)
https://www.nowcoder.com/practice/4edf6e6d01554870a12f218c94e8a299
#include <algorithm>
#include <vector>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 计算成功举办活动需要多少名主持人
* @param n int整型 有n个活动
* @param startEnd int整型vector<vector<>> startEnd[i][0]用于表示第i个活动的开始时间,startEnd[i][1]表示第i个活动的结束时间
* @return int整型
*/
/*
Lambda 表达式 int n = 2;
std::sort(data.begin(), data.end(),
[n](const std::vector<int>& a, const std::vector<int>& b) {
return a[n] < b[n];
}
模板:
[capture](parameters) -> return_type { body }
实际是一个语法糖
);
*/
int minmumNumberOfHost(int n, vector<vector<int> >& startEnd) {
// write code here
long long int tmp=0;
//一个变量记录有空闲的人 一个记录正在buzy的人
//把开始时间从小到大排序
//创建一个vector 记录正在忙的人上面时候忙活完。
//优化的话 进行排序。来一个活动 更新空闲的人 看看上一轮有没有人忙完,忙完的就继续下一轮,若是空闲人数小于0,就增加人手
//思路没有问题 优化可以使用一个小根堆。每次取出较小的那个元素比较看有没有人手空闲。若两个活动开始时间一致,那么它们在数组中肯定有先后顺序 所以从小根堆中去两次,分配两次就行了 不会影响需要的人手数目。
//***********************************************
/*官解,开始时间排个序 结束时间排个序。每次开始时看有没有人手刚忙完,如果没有,就增加人手。
看上去分开了开始结束时间 让人怀疑其正确性 但实际就是这样呀 先结束的活动不一定先开始 但既然它结束了 就必然有人手空闲。什么时候结束,人什么时候空闲,和人手有多少也没关系 因为即使人手有5个 但在这之前没有活动结束 也需要增加人手。新招了3个人在同一时间 它们结束时间不一样 但结束时间一定大于开始时间 有新活动来 还是看时间截止时几个活动结束了 但始终用一个指针记录空闲的人手的结束时间就行了。*/
if(n==1)return 1;
/* 数组的第一个字符排序。sort默认按字典序排序。所以默认按下标为0比较,相等就后移一位。
sort(startEnd.begin(),startEnd.end(),[](const vector<int>& a,const vector<int>& b){return a<b;});
注意这里的函数体内分号不能省略*/
vector<int> start(n);
vector<int> end(n);
for(int i=0;i<n;i++){
start[i]=startEnd[i][0];
end[i]=startEnd[i][1];
}
sort(start.begin(), start.end());
sort(end.begin(),end.end());
int num=0;
int j=0;//结束的数组 指针指向
for(int i=0;i<n;i++){
if(end[j]<=start[i]){
j++;
}
else{
num++;
}
}
return num;
}
};
查看4道真题和解析
