题目:
给定一个无序整形数组,要求返回排序后相邻两个数的最大差值。
例如:输入数组[1,2,3,5,9,6,8,7]
排序后:[1,2,3,5,6,7,8,9]
最大差值为5-3=2
解决办法:
1.对原数组进行排序,然后逐个求差值
2.首先遍历数组,求得数组的最大值max和最小值min,然后将max-min的区间划分为n+1个桶,再遍历数组,将数组元素依次放入对应的桶中,最后一定有空桶,找到空桶前后两个桶里边的最大差值,直到遍历完所有的桶。
package sort.all;
import java.util.ArrayList;
import java.util.List;
public class BiggistDiff {
public static void main(String[] args) {
// int[] nums = new int[] { 1, 2, 5, 7, 9, 8, 10 };
int[] nums = new int[] { 0,6,3,16,7,10,9,11,20,18 };
System.out.println(getBiggistDiff(nums));
}
private static int getBiggistDiff(int[] nums) {
int min = nums[0];
int max = nums[0];
for (int data : nums) {
if (min > data) {
min = data;
}
if (max < data) {
max = data;
}
}
List<List<Integer>> bucket = new ArrayList<>();
for (int i = 0; i <= nums.length; i++) {
bucket.add(new ArrayList<Integer>());
}
for (int data : nums) {
int tag = (int) ((data - min) * nums.length / (max - min));
List<Integer> list = bucket.get(tag);
list.add(data);
}
int currentMax = Integer.MIN_VALUE;
int p = bucket.size() - 1;
int q = bucket.size() - 1;
boolean flag = false;
while (p >= 0) {
if (bucket.get(p).isEmpty() && flag == false) {
q = p + 1;
p--;
flag = true;
} else {
if (flag) {
if (!bucket.get(p).isEmpty()) {
int dif = getMin(bucket.get(q)) - getMax(bucket.get(p));
currentMax = currentMax < dif ? dif : currentMax;
q = p;
flag = false;
}
p--;
} else {
p--;
q--;
}
}
}
return currentMax;
}
private static int getMin(List<Integer> list) {
int min = Integer.MAX_VALUE;
for (Integer data : list) {
min = data < min ? data : min;
}
return min;
}
private static int getMax(List<Integer> list) {
int max = Integer.MIN_VALUE;
for (Integer data : list) {
max = data > max ? data : max;
}
return max;
}
}