有一個整形陣列A,請設計一個複雜度為O(n)的演算法,算出排序後相鄰兩數的最大差值。
阿新 • • 發佈:2018-12-12
有一個整型陣列,請設計一個複雜度為O(n)的演算法,算出排序後相鄰兩數的最大差值。
Given an unsorted array, find the maximum difference between the successive elements in its sorted form.
Try to solve it in linear time/space. Return 0 if the array contains less than 2 elements. You may assume all elements in the array are non-negative integers and fit in the 32-bit signed integer range.
給定未排序的陣列,找到其排序形式中的連續元素之間的最大差值。
嘗試線上性時間/空間中解決它。 如果陣列包含少於2個元素,則返回0。 你可以假設陣列中的所有元素都是非負整數,並且適合32位有符號整數範圍。
Example 1:
Input: [3,6,9,1] Output: 3 Explanation: The sorted form of the array is [1,3,6,9], either (3,6) or (6,9) has the maximum difference 3.
Example 2:
Input: [10] Output: 0 Explanation: The array contains less than 2 elements, therefore return 0.
public static int findMaxDivision(int[] nums) {
if (nums == null || nums.length < 2) {
return 0;
}
// 找出陣列的最大值和最小值
int max = nums[0];
int min = nums[0];
for (int i = 1; i < nums.length; i++) {
if (nums[i] < min) {
min = nums[i];
}
if (nums[i] > max) {
max = nums[i];
}
}
if (max == min) {
return 0;
}
int[] minA = new int[nums.length + 1]; // 存放每個桶中的最小值,最後一個桶剛好用來放最大值
int[] maxA = new int[nums.length + 1]; // 存放每個桶中的最大值
for (int i = 0; i < nums.length + 1; ++i) {
minA[i] = -1;
maxA[i] = -1;
}
double interval = (double) nums.length / (max - min);
for (int i = 0; i < nums.length; i++) { // 注意i的範圍,不是nums.length+1,會越界
int tag = (int) ((nums[i] - min) * interval);
if (minA[tag] == -1) {
minA[tag] = nums[i];
maxA[tag] = nums[i];
} else {
minA[tag] = Math.min(minA[tag], nums[i]);
maxA[tag] = Math.max(maxA[tag], nums[i]);
}
}
// 找出第一個空桶的前一個桶的最大值和最後一個空桶的後一個桶的最小值
int result = 0;
int prev = maxA[0];
for (int i = 1; i < nums.length + 1; i++) {
if (minA[i] != -1) {
result = Math.max(result, minA[i] - prev);
prev = maxA[i];
}
}
return result;
}
本文參考: