题目
请设计一个复杂度为O(n)的算法,计算一个未排序数组中排序后相邻元素的最大差值。
给定一个整数数组A和数组的大小n,请返回最大差值。保证数组元素个数大于等于2小于等于500。
测试样例:
[9,3,1,10],4
返回:6
解法
因为题目提到时间复杂度为n,所以需要用到复杂度为n的排序算法,计数排序是一个很好的选择。计数排序是一种用空间换取时间的做法,首先找出未排序数组A[]中的最大值和最小值,然后以此建立一个新的数组arr[]作为桶,然后遍历原数组A[],将新数组对应下标为A[i]-min的元素自加一,遍历完成后获得一个桶。
最后通过计算空桶的个数+1,得到此题的答案。
下图为桶的情况
1 | 1 | 1 | 1 | ||||||
---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
具体代码实现如下:
import java.util.*;
public class MaxDivision {
public int findMaxDivision(int[] A, int n) {
// write code here
int Max = 0,count = 0,min = A[0],max = A[0];
for(int i = 0;i < n;i++){
if(A[i] > max){
max = A[i];
}
if(A[i] < min){
min = A[i];
}
}
//桶排序
int arr[] = new int[max - min + 1];
for (int i = 0; i < A.length;i++) {
arr[A[i] - min]++; // 填桶
}
//计算空桶数量加1
for (int i = 0; i < arr.length;i++){
if(arr[i] == 0){
count++;
}
else{
if(count > Max){
Max = count;
}
count = 0;
}
}
return Max + 1;
}
}