/**
给定一个数组,求如果排序之后,相邻两数的最大差值,要求时
间复杂度O(N),且要求不能用非基于比较的排序(桶排序)
分析:题目要求了不能使用 非基于比较的排序,但是我们可以借用桶排序的概念
假设有N个数,设置N+1个桶,将数放到桶中,最大值放到最后一个桶,
最小值放到第一个桶,故中间一定存在一个空桶(至少)
设计空桶的目的是否定最大差值来之一个桶内,而不是说最大差值一定在空桶附近
*/
import java.util.Arrays;
public class C04_MaxGap {
public static int maxGap(int arr[]){
if(arr==null || arr.length<2){
return 0;
}
//1.先找出数组中的最大值 最小值
int maxNum = arr[0],minNum = arr[0];
int len = arr.length;
for (int i = 1; i < len; i++) {
maxNum = maxNum>arr[i]?maxNum:arr[i];
minNum = minNum<arr[i]?minNum:arr[i];
}
//如果最大值与最小值相等(数组里面只有一种数)
if(maxNum==minNum){
return 0;
}
//2.将数放入相应桶中(当然,只是借用了桶的概念)
boolean hasNum[] = new boolean[len+1];
int max[] = new int[len+1];
int min[] = new int[len+1];
for (int i = 0; i < len; i++) {
int gap = gapCount(arr[i],len,maxNum,minNum);//计算arr[i]应该在哪个桶
//判断原来的桶是否有数,如果有就比较,没就直接加入
max[gap] = hasNum[gap] ? Math.max(max[gap], arr[i]) : arr[i];
min[gap] = hasNum[gap] ? Math.min(min[gap], arr[i]) : arr[i];
hasNum[gap] = true;
}
//3.判断前一个非空桶与后一个非空桶的差值
int res = 0;
int cur = max[0];//用于比较的过度值
for (int i = 1; i <= len; i++) {
if(hasNum[i]){
res = Math.max(res, min[i]-cur);
cur = max[i];
}
}
return res;
}
//计算arr[i]应该在哪个桶(此行是关键)
private static int gapCount(int num, int len, int maxNum, int minNum) {
return (int)((num-minNum)*len / (maxNum-minNum)) ;// !!!!!!
}
for test/
//使用对数器进行对数
public static int comparator(int[] nums) {
if (nums == null || nums.length < 2) {
return 0;
}
Arrays.sort(nums);
int gap = Integer.MIN_VALUE;
for (int i = 1; i < nums.length; i++) {
gap = Math.max(nums[i] - nums[i - 1], gap);
}
return gap;
}
//产生一个随机数组
public static int[] generateRandomArray(int maxSize, int maxValue) {
int[] arr = new int[(int) ((maxSize + 1) * Math.random())];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random());
}
return arr;
}
//复制数组
public static int[] copyArray(int[] arr) {
if (arr == null) {
return null;
}
int[] res = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
res[i] = arr[i];
}
return res;
}
public static void main(String[] args) {
int testTime = 500000;
int maxSize = 100;
int maxValue = 100;
boolean succeed = true;
for (int i = 0; i < testTime; i++) {
int[] arr1 = generateRandomArray(maxSize, maxValue);
int[] arr2 = copyArray(arr1);
if (maxGap(arr1) != comparator(arr2)) {
succeed = false;
break;
}
}
System.out.println(succeed ? "Fucking Nice!" : "Fucking fucked!");
}
}
最大差值问题
最新推荐文章于 2020-08-12 20:41:29 发布