题目描述:
Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],…] (si < ei), find the minimum number of conference rooms required.
样例:
Given intervals = [(0,30),(5,10),(15,20)], return 2.
思路讲解:这个就是看时间间隔重复的有多少,然后重复的不能共用一个会议室,所以我们只需要看重复最大的数是多少,故我们这个就是找出最大的重复数。首先建立一个数组来模拟时间轴,某个时间会议开始就将该处的值加1,在某个时间点会议结束就将该处的值置为-1.这样我们求重复的最大个数,就是求数组某一段的和最大即1的个数最多也即会议时间重复的个数,这样就将问题简化的很简单了。
代码详解:
/**
* Definition of Interval:
* classs Interval {
* int start, end;
* Interval(int start, int end) {
* this->start = start;
* this->end = end;
* }
* }
*/
class Solution {
public:
/**
* @param intervals: an array of meeting time intervals
* @return: the minimum number of conference rooms required
*/
int minMeetingRooms(vector<Interval> &intervals) {
// Write your code here
int len=intervals.size();
int max=0;
for(int i=0;i<len;i++){//找出最大的数,即时间最晚结束的时间
if(intervals[i].end>max){
max=intervals[i].end;
}
}
int *p=new int[max+1];//建立时间轴
for(int i=0;i<=max;i++){
p[i]=0;
}
for(int i=0;i<len;i++){
p[intervals[i].start]=p[intervals[i].start]+1;
p[intervals[i].end]=p[intervals[i].end]-1;
}
//printvector(p,max+1);
int sum=0;
int res=INT_MIN;;
for(int i=0;i<=max;i++){//找出最大的重复数
sum=sum+p[i];
if(res<sum){
res=sum;
}
}
return res;
}
void printvector(int *p,int m){
for(int i=0;i<m;i++){
cout<<p[i]<<" ";
}
cout<<endl;
}
};