package com.interview.algorithms.array; import com.interview.basics.sort.QuickSorter; /** * Created_By: stefanie * Date: 14-9-4 * Time: 下午4:00 * * Given an unsorted array of number, find the max difference between the numbers in sorted order. time O(N), space O(N) * * Solution: using bucket sort. * 1. find the min and max O(N) * 2. create N bucket, bucket[i][0] is the min value in this bucket, and bucket[i][1] is the max value. * 3. place the n number in bucket: O(N) * 3.1 the n numbers in range of [min,max], the min difference is (max-min)/n-1 (bar), define this as the bar to do the bucket placement. * 3.2 for each number the index of bucket is pos = (number[i] - min)/ bar * 3.3 in several numbers fall in one bucket only trace the min and max number. * 4. the max diff should be the diff between bucket (avoid empty bucket). * * The key point of this solution is: the min value of the diff should be (max-min)/n-1, so use this as the range of bucket. */ public class C4_51_MaxDifference { static QuickSorter<Integer> SORTER = new QuickSorter<Integer>(); public static int find(Integer[] numbers){ int n = numbers.length; int max = Integer.MIN_VALUE; int min = Integer.MAX_VALUE; for(int i = 0; i < n; i++){ if(numbers[i] > max) max = numbers[i]; if(numbers[i] < min) min = numbers[i]; } int bar = (max-min)/(n-1); int[][] bucket = new int[n][2]; for (int i = 0; i < n; i++){ int pos = (numbers[i] - min) / bar; if (bucket[pos][0] == 0){ bucket[pos][0] = bucket[pos][1] = numbers[i]; } else { if (numbers[i] > bucket[pos][1]) bucket[pos][1] = numbers[i]; if (numbers[i] < bucket[pos][0]) bucket[pos][0] = numbers[i]; } } int maxDiff = 0; for (int i = 1; i < n; i++){ if (bucket[i][0] != 0){ int j = i - 1; while(bucket[j][0] == 0) j--; int diff = bucket[i][0] - bucket[j][1]; if (maxDiff < diff) maxDiff = diff; } } return maxDiff; } public static int correctAnswer(Integer[] numbers){ SORTER.sort(numbers); int max = 0; for(int i = 0; i < numbers.length - 1; i++){ int diff = numbers[i + 1] - numbers[i]; if(diff > max) max = diff; } return max; } }