问题描述:给定n个乱序的实数,求这些数在实数轴上相邻2个数之间的最大差值,假设对任何实数的下取整函数耗时O(1),设计解最大间隙问题的线性时间算法。
思路:如果采用先排序,再求解最大间隙的方式,即使是采用堆排序,解处该问题的复杂度也在O(nlogn)。要在线性时间内求解,可以采用“鸽舍原理”,我们首先找到这组数的最大和最小值,将两个数之间的数轴分为n+1份,将这n个数依次放到这n+1个区间中,由“鸽舍原理”可知,其中必有一个区间没有数,则最大间距应是该区间的前一个区间中最大数与该区间后一个区间中最小数之间的差值。
代码:
float max_num(float num_arr[], int n) { #找出该组数中最大值。
float temp = num_arr[0];
for (int i = 1;i < n;i++) {
if (temp < num_arr[i]) temp = num_arr[i];
}
return temp;
}
float min_num(float num_arr[], int n) {#找出该组数中最小值。
float temp = num_arr[0];
for (int i = 1;i < n;i++) {
if (temp > num_arr[i]) temp = num_arr[i];
}
return temp;
}
float max_gap(float num_arr[], int n) { #求解最大间隙
float *high = new float[n + 1]; #用于记录每个区间最大值。n个数,总共n+1个区间。
float *low = new float