数组的最大间隔

数组的最大间隔:

给定整数数组A[0...N-1],求这N个数排序后的最大间隔。要求时间复杂度为O(N)。

如:数组:1,7,14,9,4,13。

排序后:1,4,7,9,13,14。最大间隔为4。

问题分析:

如果对原数组排序,然后后项减前项的最大值,即为所求解。但是时间复杂度为O(nlogn)。这里借鉴桶排序或hash映射的思想。

程序实现:

 1 /***************************************
 2 FileName CalcMaxGap.cpp
 3 Author : godfrey
 4 CreatedTime : 2016/5/4
 5 ****************************************/
 6 #include <iostream>
 7 #include <cstring>
 8 #include <vector>
 9 #include <algorithm>
10 #include <stdio.h>
11 #include <stdlib.h>
12 
13 using namespace std;
14 
15 typedef struct tagSBucket{
16     bool bValid;
17     int nMax;
18     int nMin;
19 
20     tagSBucket():bValid(false) {}
21 
22     void Add(int value){
23         if(!bValid){
24             nMax = nMin = value;
25             bValid = true;
26         }
27         else{
28             if(nMax < value)
29                 nMax = value;
30             else if(nMin > value)
31                 nMin = value;
32         }
33     }
34 }SBucket;
35 
36 int CalcMaxGap(int* A,int size){
37     SBucket* pBucket = new SBucket[size];
38     int nMax = A[0];
39     int nMin = A[0];
40     int i;
41     //获取最值
42     for(i=1;i<size;i++){
43         if(nMax < A[i])
44             nMax = A[i];
45         else if(nMin > A[i])
46             nMin = A[i];
47     }
48     //将数组中的数据平均分到size个桶中
49     int diff = nMax - nMin;
50     int nBucket;
51     for(i=0;i<size;i++){
52         nBucket = (A[i] - nMin) * size / diff;
53         if(nBucket >=size)
54             nBucket = size-1;
55         pBucket[nBucket].Add(A[i]);
56     }
57     //获取有效桶的最大间隔
58     i = 0;
59     int nGap = diff / size;//最小间隔
60     int Gap;
61     for(int j = 1;j<size;j++){//j是当前桶,i是上一个桶
62         if(pBucket[j].bValid){
63             Gap = pBucket[j].nMin - pBucket[i].nMax;
64             if(Gap > nGap)
65                 nGap = Gap;
66             i = j;
67         }
68     }
69     delete[] pBucket;
70     return nGap;
71 }
72 int main()
73 {
74     int a[] = {1,4,7,9,13,14};
75     int size = sizeof(a)/sizeof(int);
76     for(int i=0;i<size;i++){
77         cout<<a[i]<<" ";
78     }
79     cout<<endl;
80     int MaxGap = CalcMaxGap(a,size);
81     cout<<"-----------After Calculation ------------"<<endl;
82     cout<<"The Max Gap : "<<MaxGap<<endl;
83     return 0;
84 }

运行结果:

说明:求最值,平均分割桶的数据,最后求最大间隔时间复杂度分别为O(n)。最后时间复杂度为O(n)。

转载请注明出处:

C++博客园:godfrey_88

http://www.cnblogs.com/gaobaoru-articles/

转载请注明出处: C++博客园:godfrey_88 http://www.cnblogs.com/gaobaoru-articles/
原文地址:https://www.cnblogs.com/gaobaoru-articles/p/5460195.html