给定一个整形数组arr,返回排序后相邻两数的最大差值
arr = [9, 3, 1, 10]。如果排序,结果为[1, 3, 9, 10],9和3的差为最大差值,故返回6。
arr = [5, 5, 5, 5]。返回0。
[要求]
时间复杂度为
,空间复杂度为
第一行一个整数N。表示数组长度。
接下来N个整数表示数组内的元素
输出一个整数表示答案
4 9 3 1 10
6
4 5 5 5 5
0
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); String[] strArr = br.readLine().split(" "); int[] arr = new int[n]; int max = Integer.MIN_VALUE; for(int i = 0; i < n; i++) { arr[i] = Integer.parseInt(strArr[i]); max = Math.max(max, arr[i]); } int maxBits = getMaxBits(max); radixSort(arr, maxBits); int maxDiff = -1; for(int i = 1; i < n; i++) maxDiff = Math.max(arr[i] - arr[i - 1], maxDiff); System.out.println(maxDiff); } // 基数排序 private static void radixSort(int[] arr, int maxBits) { final int radix = 10; int n = arr.length; int[] bucket = new int[n]; for(int d = 1; d <= maxBits; d++){ int[] count = new int[radix]; // 按倒数第d位计算词频数组 for(int i = 0; i < n; i++){ int digit = getDigits(arr[i], d); count[digit] ++; } // 计算词频数组的前缀和 for(int i = 1; i < radix; i++) count[i] += count[i - 1]; // 按数位入桶(通过词频数组前缀和就可以知道某个数要进入哪个桶) for(int i = arr.length - 1; i >= 0; i--){ int j = getDigits(arr[i], d); bucket[count[j] - 1] = arr[i]; count[j] --; } for(int i = 0; i < n; i++) arr[i] = bucket[i]; // 出桶 } } // 获得数的十进制位数 private static int getMaxBits(int num) { int bits = 0; while(num != 0){ bits ++; num /= 10; } return bits; } // 获得一个数倒数第d位的数字 private static int getDigits(int num, int d) { int res = 0; for(int i = 1; i <= d; i++){ res = num % 10; num /= 10; } return res; } }
import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int MAX =Integer.MIN_VALUE; int MIN = Integer.MAX_VALUE; int n = scanner.nextInt(); int[] arr = new int[n]; for(int i=0;i<n;i++){ arr[i] = scanner.nextInt(); MAX = Math.max(arr[i], MAX); MIN = Math.min(arr[i], MIN); } int max[] = new int[n+1]; int min[] = new int[n+1]; boolean hasNum[] = new boolean[n+1]; for(int i=0;i<n+1;i++) { max[i] = Integer.MIN_VALUE; min[i] = Integer.MAX_VALUE; } for(int i=0;i<n;i++) { int bucketNum = bucket(arr[i], n, MIN, MAX); max[bucketNum] = Math.max(max[bucketNum], arr[i]); min[bucketNum] = Math.min(min[bucketNum], arr[i]); hasNum[bucketNum] = true; } int res = 0; int lastMax = max[0]; for(int i = 1;i<n+1;i++) { if(hasNum[i]) { res = Math.max(res,min[i]-lastMax ); lastMax = max[i]; } } System.out.println(res); } public static int bucket(long num,long len,long min, long max){ return (int) ((num-min)*len/(max-min)); } }