有无序的实数列 V[N],要求求里面大小相邻的实数的差的最大值,关键是要求线性空 间和线性时间

转自:http://marinemath.wordpress.com/tag/algorithms/

昨天逛csdn看到一道很有意思的问题:

有无序的实数列V[N],要求求里面大小相邻的实数的差的最大值M,要求线性空间和线性时间

既然是要求线性时间,普通的排序方式就不能采用了,而时间复杂度为O(n)的排序方法就无非基数排序和桶排序。于是就有了对应的解法。

1. 桶排序: 最关键的建桶,如果桶设计得不好的话桶排序是几乎没有作用的。通常情况下,上下界有两种取法,第一种是取一个10^n或者是2^n的数,方便实现。另一种是取数列的最大值和最小值然后均分作桶。

对于这个题,最关键的一步是:由抽屉原理知:M>= (Max(V[n])-Min(V[n]))/(n-1)! 所以,假如以(Max(V[n])-Min(V[n]))/(n-1)为桶宽的话,答案一定不是属于同一个桶的两元素之差。因此,这样建桶,每次只保留桶里面的最大值和最小值即可。

2.基数排序: 我还没想好(= =),但是实数列要用基数排序还是很困难的。

#include

#include

using namespace std;

const double C=10e10;

int main()

{

int s[100],Max_s[100],Min_s[100];

int n;

dounle Max=-C,Min=C;

cin>>n;

for (int i=0;i!=n;++i)
{

cin>>s[i];

Max=max(Max,s[i]);

Min=min(Min,s[i]);

Max_s[i]=-C;

Min_s[i]=C;

double length=(Max-Min)/(n-1);

for(int i=0;i!=n;++i)

{

Max_s[(int)((s[i]-Min)/length)]=max(s[i],Max_s[(int)((s[i]-Min)/length)]);

Min_s[(int)((s[i]-Min)/length)]=min(s[i],Min_s[(int)((s[i]-Min)/length)]);

}

//Deal with max difference

你可能感兴趣的:(算法,面试题)