題目: 給定一個實數數組(無序),要求用線性時間求數軸上相鄰兩數間的最大間隔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;
- }