“给定一个无需数组,返回数组排序后,相邻元素之间最大差值。”
题目链接:
来源:力扣(LeetCode)
链接:164. 最大间距
给定一个无序的数组 nums,返回 数组在排序之后,相邻元素之间最大的差值 。如果数组元素个数小于 2,则返回 0 。
您必须编写一个在「线性时间」内运行并使用「线性额外空间」的算法。
示例 1:
输入: nums = [3,6,9,1]
输出: 3
解释: 排序后的数组是 [1,3,6,9], 其中相邻元素 (3,6) 和 (6,9) 之间都存在最大差值 3。
示例 2:
输入: nums = [10]
输出: 0
解释: 数组元素个数小于 2,因此返回 0。
题意要求将数组排序后,再找出最大间距。
对于传统的排序算法来说,都需要O(N log N)的时间复杂度,要将时间复杂度降到O(N),就必须使用其他算法。
比如使用基数排序就可以将时间复杂度降到O(N)。
代码参考:
class Solution {
public int maximumGap(int[] nums) {
int n = nums.length;
if (n < 2) {
return 0;
}
long exp = 1;
int[] buf = new int[n];
int maxVal = Arrays.stream(nums).max().getAsInt();
while (maxVal >= exp) {
int[] cnt = new int[10];
for (int i = 0; i < n; i++) {
int digit = (nums[i] / (int) exp) % 10;
cnt[digit]++;
}
for (int i = 1; i < 10; i++) {
cnt[i] += cnt[i - 1];
}
for (int i = n - 1; i >= 0; i--) {
int digit = (nums[i] / (int) exp) % 10;
buf[cnt[digit] - 1] = nums[i];
cnt[digit]--;
}
System.arraycopy(buf, 0, nums, 0, n);
exp *= 10;
}
int ret = 0;
for (int i = 1; i < n; i++) {
ret = Math.max(ret, nums[i] - nums[i - 1]);
}
return ret;
}
}
时间复杂度:O(N)
其中N是数组的长度。
空间复杂度:O(N)
其中N是数组的长度。
这道题就是讲数组排序后,然后得到相邻元素的最大差值。
但是使用普通的排序方式,时间复杂度比较高,所以使用了不基于比较的排序算法也就是基数排序。
才能使用线性时间复杂度解决。