问题描述:
请设计一个复杂度为O(n)的算法,计算一个未排序数组中排序后相邻元素的最大差值。
给定一个整数数组A和数组的大小n,请返回最大差值。保证数组元素个数大于等于2小于等于500。
测试样例:
[9,3,1,10],4
返回:6
AC 代码:
class MaxDivision {
public:
int findMaxDivision(vector<int> A, int n) {
// write code here
if(n<2) return 0;
int up=A[0];//数组中最大的数
int down=A[0];//数组中最小的数
for(int i=1;i<n;i++){
if(A[i]>up)
up=A[i];
else if(A[i]<down)
down=A[i];
}
int len=up-down;
if(len<=1)
return len;
vector<int> bucketMax(n,INT_MIN);//记录桶中最大的数
vector<int> bucketMin(n,INT_MAX);//记录桶中最小的数
for(int i=0;i<n;i++){
int index=(double)(A[i]-down)/len*(n-1);//映射到n个桶中的一个,先除再乘避免溢出
bucketMax[index]=max(bucketMax[index],A[i]);
bucketMin[index]=min(bucketMin[index],A[i]);
}
int gap=0;
int pre=bucketMax[0];//0号桶肯定不是空桶,下界在里面
for(int i=1;i<n;i++){
if(bucketMax[i]!=INT_MIN){//i号桶不是空桶
gap=max(gap,bucketMin[i]-pre);
pre=bucketMax[i];
}
}
return gap;
}
};