LeetCode: 164. 最大间距
排序之后, 计算相邻元素之间的最大差值。
要求: 在线性时间复杂度 和 空间复杂度
线性时间复杂度 >> O ( n ) O(n) O(n)
快排,归并复杂均为 O ( n l o n g n ) O(nlongn) O(nlongn) >> 不属于线性时间复杂度。
所以这道题解法必然要用 >> 基数排序、桶排序 >> ( O ( n ) O(n) O(n)
查看这部分源码 , 这个查找的时间复杂度是多少 >> 待补
int maxVal = Arrays.stream(nums).max().getAsInt();
基数排序、桶排序, 还没理解, 待补
基数排序
public int maximumGap(int[] nums) {
int len = nums.length;
int ans = 0;
if(len < 2) return ans;
int[] buf = new int[len];
// 取出最大值
int mxVal = Arrays.stream(nums).max().getAsInt();
int exp = 1;
while(mxVal >= exp){
int[] cnt = new int[10];
for (int i = 0; i < len; i++) {
// 取出当前位
int digit = (nums[i] / exp) % 10;
// 统计当前位有几位
cnt[digit]++;
}
// System.out.println(" ------------------------------- ");
// System.out.println(Arrays.toString(cnt));
// 这块是干嘛用的 ??
for (int i = 1; i < 10; i++) {
cnt[i] += cnt[i - 1];
}
// System.out.println(Arrays.toString(cnt));
for (int i = len - 1; i >= 0; i--) {
int digit = (nums[i] / exp) % 10;
buf[cnt[digit] - 1] = nums[i];
// 该桶里拥有的数 -1
cnt[digit]--;
}
// 拷贝临时数组到
System.arraycopy(buf, 0, nums, 0, len);
// 下一位
exp *= 10;
}
// 计算差值
for (int i = 1; i < len; i++) {
ans = Math.max(ans, nums[i] - nums[i - 1]);
}
return ans;
}
时间复杂度: O ( N ) O(N) O(N)
空间复杂度: O ( N ) O(N) O(N)
虽然AC, 但是是错误解法, 不符合题目要求
直接使用 Arrays.sort 函数 (快排 O ( n l o g n ) O(nlogn) O(nlogn)) >> 不属于线性时间复杂度
public int maximumGap(int[] nums) {
int len = nums.length;
int ans = 0;
if(len < 2) return ans;
Arrays.sort(nums);
for (int i = 1; i < nums.length; i++) {
ans = Math.max(nums[i] - nums[i - 1], ans);
}
return ans;
}