高效的安排见面会

《编程之美》第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;  
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值