线性时间求最大间隔

 题目: 给定一个实数数组(无序),要求用线性时间求数轴上相邻两数间的最大间隔

关键:将除最大最小的n-2个数(或小于n-2) 投入n-1个桶中,这里利用的鸽巢原理,至少一个桶是空的。

  
  
  
  
  1. #include<iostream> 
  2. using namespace std; 
  3.  
  4. void print(string, float *, int); 
  5.  
  6. float data[] = {3.4, 2.1, 5.1, 1.4, 8.5, 7.4, 6.3}; 
  7.  
  8. float getMax(float data[], int size){ 
  9.     int i; 
  10.     float max = data[0]; 
  11.     for (i = 1; i < size; ++i) { 
  12.         if (data[i]>max) 
  13.             max = data[i]; 
  14.     } 
  15.     return max; 
  16.  
  17. float getMin(float data[], int size){ 
  18.     int i; 
  19.     float min = data[0]; 
  20.     for (i = 1; i < size; ++i) { 
  21.         if (data[i]<min) 
  22.             min = data[i]; 
  23.     } 
  24.     return min; 
  25.  
  26. float findMaxGap(float data[], int size){ 
  27.     float max = getMax(data, size); 
  28.     float min = getMin(data, size); 
  29.     cout<<max<<" "<<min<<endl; 
  30.     int slot = size-1; 
  31.     float gap = (max-min)/slot; 
  32.     float *high = new float[slot]; 
  33.     float *low = new float[slot]; 
  34.     for (int i = 0; i < slot; ++i) { 
  35.         high[i] = min; 
  36.         low[i] = max; 
  37.     } 
  38.  
  39.     for (int j = 0; j < size; ++j) { 
  40.         if(data[j]!=max&& data[j]!=min){ 
  41.             int index = (data[j] - min)/gap; 
  42.             if(high[index]<data[j]) 
  43.                 high[index]= data[j]; 
  44.             if(low[index]>data[j]) 
  45.                 low[index]=data[j]; 
  46.         } 
  47.     } 
  48.  
  49.     print("high array", high, slot); 
  50.     print("low  array", low,slot); 
  51.  
  52.     float maxGap = 0; 
  53.     float lowedg = min; 
  54.     for (int var = 0; var < slot; ++var) { 
  55.         if(high[var]!=min){ 
  56.             if(low[var]-lowedg>maxGap) 
  57.                 maxGap = low[var]-lowedg; 
  58.             lowedg = high[var]; 
  59.         } 
  60.     } 
  61.  
  62.     return maxGap; 

 

你可能感兴趣的:(职场,休闲,最大间隔)