相邻数的最大差值

题目描述:给定一个整型数组arr,返回排序后相邻两数的最大差值。

输入样例:[1,4,3,6,5]

输出样例:2

解题思路:

  • 思想来自于桶排序;

  • 先遍历数组,找到最小值Min和最大值Max;

  • 在Min和Max范围内(例如:Min = 1,Max = 9,则区间为[1,9),9为开区间),等量分为n个区间(n为数组长度);

  • 每个区间对应一个桶,每个数根据自己的区间选择对应的桶,最大值单独放到n号桶中,则0号桶和n号桶必定有元素;

  • 同一个桶中的元素差值不会大于桶区间,相邻桶间的差值不会小于桶区间内,空桶(没放任何元素的桶)两侧桶中元素的差值必定大于同一个桶中的,所以不用考虑同一个桶的相邻数;

  • 只考虑当前桶的最小值减去前一个不为空桶的桶的最大值,其中的最大值为题解。

  • 时间复杂度O(N),空间复杂度O(N)。

    Java的实现代码:

       public int findMaxDiff(int[] arr) {
    
            int min = Integer.MAX_VALUE;
            int max = Integer.MIN_VALUE;
    
            for (int i = 0; i < arr.length; i++) {
                min = Math.min(min, arr[i]);
                max = Math.max(max, arr[i]);
            }
            //记录每个桶的最大值和最小值
            int[] bucketMax = new int[arr.length + 1];
            int[] bucketMin = new int[arr.length + 1];
            //记录桶是否有元素
            boolean[] hasNum = new boolean[arr.length + 1];
            //遍历确定每个桶的最大最小值
            for (int i = 0; i < arr.length; i++) {
                //确定元素桶号
                int bucket = (arr[i] - min) * arr.length / (max - min);
                bucketMax[bucket] = hasNum[bucket] ? Math.max(bucketMax[bucket], arr[i]) : arr[i];
                bucketMin[bucket] = hasNum[bucket] ? Math.min(bucketMin[bucket], arr[i]) : arr[i];
                hasNum[bucket] = true;
            }
            //前一个桶的最大值
            int perMax = bucketMax[0];
            int res = 0;
            for (int i = 0; i < arr.length + 1; i++) {
                if (hasNum[i]) {
                    res = Math.max(bucketMin[i] - perMax, res);
                    perMax = bucketMax[i];
                }
            }
            return res;
        }

    参考https://blog.youkuaiyun.com/li563868273/article/details/50495534

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值