Leetcode 164 Maximum Gap (最大差距)

一,问题描述

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值