Given an unsorted array, find the maximum difference between the successive elements in its sorted form.
Try to solve it in linear time/space.
Return 0 if the array contains less than 2 elements.
You may assume all elements in the array are non-negative integers and fit in the 32-bit signed integer range
题目其实给很明显是用桶排序,桶间距(b-a)/(n-1) 放进去的元素n-2个。最小的元素肯定在数组里
直接给代码。。(看了半天没C语言版的。。给个C的)
#include <stdio.h>
#include <math.h>
#define MIN_VALUE -9999
#define MAX_VALUE 9999
int fun(int num[],int len){
if (len == 0 || len<2) return 0;
int maxval = MIN_VALUE;
int minval = MAX_VALUE;
for (int i = 0 ; i < len ; i++){
maxval = num[i]>maxval?num[i]:maxval;
minval = num[i]>minval?minval:num[i];
}
if (minval == maxval) return 0;
if (len == 2) return maxval - minval;
int box_len = (int)ceil((double)(maxval-minval)/(len-1));
int n = (maxval - minval)/box_len;
int maxBuk[n+1],minBuk[n+1];
for(int i = 0 ; i < n+1;i++){
maxBuk[i] = MIN_VALUE;
minBuk[i] = MAX_VALUE;
}
for (int j = 0 ; j < len ; j ++){
int temp = (num[j]-minval)/box_len;
maxBuk[temp] = num[j]>maxBuk[temp]?num[j]:maxBuk[temp];
minBuk[temp] = num[j]>minBuk[temp]?minBuk[temp]:num[j];
}
int gap = 0;
int pre = minBuk[0];
for(int i = 1; i <= n ; i++){
if (maxBuk[i]==MIN_VALUE && minBuk[i]==MAX_VALUE){
continue;
}
gap = gap>minBuk[i]-pre?gap:minBuk[i]-pre;
pre = maxBuk[i];
}
return gap;
}
int main(){
int a[10] = {1,5,5,5,5,5,5,5,5,5};
printf("%d",fun(a,10));
}