一,问题描述
1,给一个没有排序的数组,当排序后找出连续两个元素之间相差最大的数,并且输出这个数。
2,限制条件:
需要在线性的时间和空间复杂度。如果数组长度小于2,则输出0。数组中的所有数为非负数。
3,解题思想:
由于时间复杂度为O(n),因此利用到了桶排序算法。桶排序算法网上很多参考资料的。它基本思想就是是将一个数据表分割成许多个bucket(桶),然后每个bucket可以各自排序(可以采用不同的排序算法)。它是典型的分而治之的策略。
还要注意的一点,就是桶的个数问题。我们可以构造合适的桶个数n,我们使用了桶的长度bucketlenth=(Max-Min)/(len-1)+1,最后计算桶的个数
bucketcount=(Max-Min)/bucketlenth+1;
二,AC了的程序(用java实现)
import java.util.*; //leetcode 164
public class Test2{
public int maximumGap(int []nums)
{
if(nums==null||nums.length<2)
{
return 0;
}
int []result=bucketsort(nums);
int difference=0;
for(int i=0;i<result.length-1;i++)
{
if((result[i+1]-result[i])>difference)
{
difference=(result[i+1]-result[i]);
}
}
return difference;
}
public int[] bucketsort(int []nums)
{
int []result=new int[nums.length];
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];
}
}
int bucketlength=(max-min)/(nums.length-1)+1;
int bucketcount=(max-min)/bucketlength+1; //桶的个数计算是很重要的
List list[]=new ArrayList[bucketcount]; //建立二维集合List
for(int i=0;i<nums.length;i++)
{
int number=(int)(Math.floor((nums[i]-min)/bucketlength));
if(list[number]==null)
{
list[number]=new ArrayList();
}
list[number].add(nums[i]);
}
for(int i=0;i<bucketcount;i++) //对每个桶使用Collections.sort()方法进行排序
{
if(list[i]!=null) {
Collections.sort(list[i]);
}
}
int k=0;
for(int i=0;i<bucketcount;i++)
{
if(list[i]!=null) {
for (int j = 0; j < list[i].size(); j++) {
result[k] = (int) list[i].get(j);
k++;
}
}
}
return result;
}
public static void main(String []agrs)
{
Test2 test=new Test2();
int []nums={5,10,3,2,1,23,21};
// int []nums={2,99999999};
//int []nums={1,2,3,4,5,6,7,8,9};
//int []nums={63,157,189,51,101,47,141,121,157,156,194,117,98,139,67,133,181,13,28,109};
int max=test.maximumGap(nums);
System.out.println("max="+max);
}
}
运行结果:
max=11