标签:
数组的最大间隔:
给定整数数组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/
标签:
原文地址:http://www.cnblogs.com/gaobaoru-articles/p/5460195.html