《编程之美》第1.9节:高效的安排见面会
下面的代码是《编程之美》P59页扩展问题一的代码,其中maxColors1函数是复杂度为O(N)的算法,即从第i个区间开始,往上的所有区间,如果和第i个区间有交,则所需要面试地点(即color染色数)增加,遍历完以后输出最大的color数。
maxColors2是改良以后的算法,复杂度为O(NlogN)因为其中涉及到了排序,从起始点到终止点,所有点开始排序,如果遇到起始点,就增加1,如果遇到终止点就减去1,就是当前区间所拥有的color数。
maxColors3是我自己想的算法,既然是面试地点,则面试时间肯定是一个不大的数,这样我开辟一个总的面试时间的数组,int *
temp,如果在第i个小时有面试正在进行,或者正要开始,则temp[i]++,最后只需要遍历整个temp数组,找出最大值即可。
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
struct Node
{
int time;
string type;
Node(int _time=0,string _type=""):time(_time),type(_type){}
};
bool isOverLap(int bi,int ei,int bj,int ej)
{
if(bj>=ei || bi>=ej)//如果不相交,则返回false
return false;
return true;
}
int maxColors1(int b[],int e[],int N)
{
int result=0;
int maxColorsNum=1;
for(int i=0;i<N;i++)
{
maxColorsNum=1;
for(int j=0;j<i;j++)
{
if(isOverLap(b[i],e[i],b[j],e[j]))
maxColorsNum++;
}
if(maxColorsNum>result)
result=maxColorsNum;
}
return result;
}
bool compare(const Node &first,const Node &second)
{
return first.time<second.time;
}
int maxColors2(int b[],int e[],int N)
{
Node *temp=new Node[2*N];
for(int i=0;i<2*N;i+=2)
{
temp[i].time=b[i>>1];
temp[i].type="begin";
temp[i+1].time=e[i>>1];
temp[i+1].type="end";
}
sort(temp,temp+2*N,compare);
int result=0;
int maxColorsNum=0;
for(int i=0;i<2*N;i++)
{
if(temp[i].type=="end")
maxColorsNum--;
else
maxColorsNum++;
result=max(result,maxColorsNum);
}
delete []temp;
return result;
}
int maxColors3(int b[],int e[],int N)
{
int beginFirst=INT_MAX,endLast=0;
for(int i=0;i<N;i++)
{
beginFirst=min(beginFirst,b[i]);
endLast=max(endLast,e[i]);
}
int maxLength=endLast+1;//表示持续时间,即第一个开始和最后一个结束的时间
int *colors=new int[maxLength];
for(int i=0;i<maxLength;i++)
colors[i]=0;//初始化为0
int maxColorsNum=0;
for(int i=0;i<N;i++)
for(int j=b[i];j<e[i];j++)
colors[j]++;
for(int i=0;i<maxLength;i++)
maxColorsNum=max(maxColorsNum,colors[i]);
delete []colors;
return maxColorsNum;
}
int main()
{
const int N=4;
int b[N]={2,3,1,3};
int e[N]={3,4,5,6};
int result1=maxColors1(b,e,N);
int result2=maxColors2(b,e,N);
int result3=maxColors3(b,e,N);
system("pause");
return 0;
}