每日算法之—排序数组相邻最大差值

题目:

给定一个无序整形数组,要求返回排序后相邻两个数的最大差值。

例如:输入数组[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;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_28044241/article/details/82422098