164. 最大间距

给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。
如果数组元素个数小于 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);
    }
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值