假设最大和最小数分别为max和min,将n个数投入n+1个桶中,桶与桶的间距gap=(max-min)/(n+1),每个数x所在的桶的位置是x/gap,利用的鸽巢原理,至少一个桶是空的,那么两个相邻数之间的最大距离必定>=gap。实现时,用两个数组分别保留每个桶中的最大、最小值,然后按顺序遍历桶,找出每个桶中最大的值和下一个不为空的桶最小的值之间的最大的,即为最大距离。
查找最大值、最小值,将数放入桶中及找出相邻非空桶之间的最大距离,时间复杂度均为O(n),因此总时间复杂度也为O(n)。
查找最大值、最小值,将数放入桶中及找出相邻非空桶之间的最大距离,时间复杂度均为O(n),因此总时间复杂度也为O(n)。
#include<iostream>
using namespace std;
void print(string, float *, int);
float data[] = {3.4, 2.1, 5.1, 1.4, 8.5, 7.4, 6.3};
float getMax(float data[], int size){
int i;
float max = data[0];
for (i = 1; i < size; ++i) {
if (data[i]>max)
max = data[i];
}
return max;
}
float getMin(float data[], int size){
int i;
float min = data[0];
for (i = 1; i < size; ++i) {
if (data[i]<min)
min = data[i];
}
return min;
}
float findMaxGap(float data[], int size){
float max = getMax(data, size);
float min = getMin(data, size);
cout<<max<<" "<<min<<endl;
int slot = size-1;
float gap = (max-min)/slot;
float *high = new float[slot];
float *low = new float[slot];
for (int i = 0; i < slot; ++i) {
high[i] = min;
low[i] = max;
}
for (int j = 0; j < size; ++j) {
if(data[j]!=max&& data[j]!=min){
int index = (data[j] - min)/gap;
if(high[index]<data[j])
high[index]= data[j];
if(low[index]>data[j])
low[index]=data[j];
}
}
float maxGap = 0;
float lowedg = min;
for (int var = 0; var < slot; ++var) {
if(high[var]!=min){ // 当桶为空时
if(low[var]-lowedg>maxGap)
maxGap = low[var]-lowedg;
lowedg = high[var];
}
}
return maxGap;
}