题目: 给定一个实数数组(无序),要求用线性时间求数轴上相邻两数间的最大间隔ios
关键:将除最大最小的n-2个数(或小于n-2) 投入n-1个桶中,这里利用的鸽巢原理,至少一个桶是空的。数组
- #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];
- }
- }
- print("high array", high, slot);
- print("low array", low,slot);
- 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;
- }