给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。
如果数组元素个数小于 2,则返回 0。
示例 1:
输入: [3,6,9,1]
输出: 3
解释: 排序后的数组是 [1,3,6,9], 其中相邻元素 (3,6) 和 (6,9) 之间都存在最大差值 3。
示例 2:
输入: [10]
输出: 0
解释: 数组元素个数小于 2,因此返回 0。
说明:
- 你可以假设数组中所有元素都是非负整数,且数值在 32 位有符号整数范围内。
- 请尝试在线性时间复杂度和空间复杂度的条件下解决此问题。
反思错误:
①int b = 10 ; long a = Integer.MAX_VALUE*b; 输出a,,这样答案是-10!!!!
而把其中一个int值改成long,,就没事了!!!例如:long a = Integer.MAX_VALUE*(long)b,,就行。
②桶排序中计算桶的id问题,,一共应该有 总个数+1 种可能————————例如:1、2、3…………len=3
id=(1-1)/(3-1)*len=0…………(3-1)/(3-1)*len=3——————0~3,四个桶id
解题思路:
桶排序,首先想想有一个个大桶并列放着…………
好了,我们要把我们的数num 减去 最小值min 然后除以 最大值与最小值的差值 再乘以长度(这是在求放在哪个编号的桶中),
我们再去求桶中的数的最大值和最小值,,也就是桶的左右边界::::::
那么问题来了,在反思错误中我们必须要建len+1个桶,而且0号桶和len号桶必定放数(看看上边反思错误我求的,最小的在0,最大的在len),那么必然有桶是空的,
好,简单了。————
我们只需要求每个有数的桶的最小值 减去 上个有数桶的最大值,总会遇到空桶的(但是别直接去找空桶啊,万一空桶有好几个呢),纪录最大的差值就是答案。。
Java代码:
//执行用时 : 7 ms, 在Maximum Gap的Java提交中击败了63.09% 的用户
//内存消耗 : 41.1 MB, 在Maximum Gap的Java提交中击败了0.00% 的用户
class Solution {
public int maximumGap(int[] nums) {
int len = nums.length;
if(len < 2) return 0;
int min = nums[0],max = nums[0];
for(int num : nums){
min = min < num ? min : num;
max = max > num ? max : num;
}
if(min == max) return 0;
int[] minbucket = new int[len+1];
int[] maxbucket = new int[len+1];
boolean[] hasbucket = new boolean[len+1];
for(int num:nums){
int bucketid = bucketid(max,min,len,num);
maxbucket[bucketid] = hasbucket[bucketid] ? Math.max(num,maxbucket[bucketid]):num;
minbucket[bucketid] = hasbucket[bucketid] ? Math.min(num,minbucket[bucketid]):num;
hasbucket[bucketid] = true;
}
int res = 0,cur = min;
for(int i=0;i<=len;++i){
if(hasbucket[i]){
res = Math.max(res,minbucket[i]-cur);
cur = maxbucket[i];
}
}
return res;
}
int bucketid(int max,int min,long len,int num){
long cur = (num - min) * len;
return (int)(cur/(max - min));
}
}