给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。
如果数组元素个数小于 2,则返回 0。
考察的是排序
基数排序:10个桶,按个位、十位...放
class Solution
{
public int maximumGap(int[] nums)
{
int len = nums.length;
if(len<2) return 0;
//找出最大值
int max = nums[0];
for(int i=1;i<len;i++)
{
max = Math.max(max,nums[i]);
}
//按位值存数值,位值可能一样,要用list<ArrayList<Integer>>
List<ArrayList<Integer>> list = new ArrayList<>();
//初始化
for(int i=0;i<10;i++)
list.add(new ArrayList<>());
//哪一位
int x=1;
while(max>0)
{
//清空之前的元素
for(int j=0;j<10;j++)
list.get(j).clear();
//将数字放入对应的位置
for(int i=0;i<len;i++)
list.get(nums[i] / x % 10).add(nums[i]);
//将数字依次拿出来
int index = 0;
for(int i=0;i<10;i++)
{
for(int j=0;j<list.get(i).size();j++)
{
nums[index] = list.get(i).get(j);
index++;
}
}
max /= 10;
x *= 10;
}
for(int i=0;i<len;i++)
max = Math.max(max,nums[i]);
return max;
}
}
桶
class Solution
{
public int maximumGap(int[] nums)
{
int len = nums.length;
if(len<2) return 0;
//找出最大值和最小值
int max = nums[0];
int min = max;
for(int i=1;i<len;i++)
{
max = Math.max(max,nums[i]);
min = Math.min(min,nums[i]);
}
if(max - min == 0) return 0;
//取间距,n-2个数n-1个盒子必定出现空白,求盒子间的最大值最小值间的距离
int interval = (int)Math.ceil((double)(max - min)/(len-1));
//存入每个盒子中的最大最小值
int[] arrMax = new int[len-1];
int[] arrMin = new int[len-1];
for(int i=0;i<len-1;i++)
{
arrMax[i] = -1;
arrMin[i] = Integer.MAX_VALUE;
}
//遍历数组元素,放入盒中
for(int i=0;i<len;i++)
{
//最大最小不管
if(nums[i] == min || nums[i] == max)
continue;
int index = (nums[i] - min) / interval;
arrMax[index] = Math.max(arrMax[index], nums[i]);
arrMin[index] = Math.min(arrMin[index], nums[i]);
}
//当前小的跟之前大的比较
//最小的作为之前最大的来比较
int maxGap = 0;
int preMax = min;
for(int i=0;i<len-1;i++)
{
if(arrMax[i] == -1) continue;
maxGap = Math.max(maxGap, arrMin[i] - preMax);
preMax = arrMax[i];
}
//最大的作为当前最小的来比较
return Math.max(maxGap, max - preMax);
}
}