对于原题,书上写的很详细,即图的着色问题,这里主要看第一个扩展和leetcode上相关的问题
扩展问题一:
简单的说就是:有 N 个面试要同时进行, 他们的面试时间分别是 B[i], E[i]. 我们希望将这N个面试安排在若干地点, 不同的面试在同一时间不能再相同的面试点. 问至少需要多少个面试点
思路:先按照开始时间排序,对每个节点赋颜色值时,在它之前开始并且有时间重叠的区域的颜色不能使用
struct Interval {
int start;
int end;
int color;
Interval() : start(0), end(0),color(-1) {}
Interval(int s, int e,int c) : start(s), end(e) ,color(c) {}
};
bool operator<(const Interval& lhs,const Interval& rhs)
{
return (lhs.start < rhs.start || (lhs.start == rhs.start && lhs.end < rhs.end));
}
bool isOverLap(const Interval& lhs,const Interval& rhs)
{
if(lhs.start >= rhs.start && lhs.start < rhs.end)return true;
if(rhs.start >= lhs.start && rhs.start < lhs.end)return true;
return false;
}
int interviewPoint(vector<Interval>& intervals)
{
sort(intervals.begin(),intervals.end());//按开始时间排序
int length = intervals.size();
vector<bool>isForbidden(length+1,false);
int i,j,maxColor = 1;
for(i = 0; i < length;++i)
{
for(j = 0;j < i;++j)
{
if(isOverLap(intervals[i],intervals[j]))isForbidden[intervals[j].color] = true;//如果区域重叠,则它的颜色不能使用
}
for(j = 1;j <= maxColor;++j)
{
if(isForbidden[j] == false)break;
}
if(j > maxColor)intervals[i].color = ++maxColor;
else intervals[i].color = j;
isForbidden.assign(length+1,false);
}
return maxColor;
}
编程之美上说,如果只需要求出面试点的个数,则可以对所有开始结束时间进行排序,然后遍历,这里有一点没有说清楚,就是当结束时间和开始时间相同时,要把所有的结束时间放在前面,具体如下:
struct Interval {
int st