无序数组如果排序之后相邻数之间的最大差值

简介: 无序数组如果排序之后相邻数之间的最大差值

题目

给定一个数组arr,
返回如果排序之后,相邻两数的最大差值

要求:时间复杂度O(N)

一、解题思路

时间复杂度要求O(N),意味着堵死了排序的可能
借用了桶排序的思想,来自于假设答案法
假设答案法出现一定都是难题
整个数组假设9个数,最小值0,最大值99, 10等分(比个数多1)
9个数,10个桶,鸽笼原理,中间必然存在空桶
如果排完序之后,相邻两数可能来自于同一个桶,也可能来自于跨桶的情况
空桶左右两侧一定有非空桶
中间必存在空桶,空桶的左侧它一定有非空桶,空桶的右侧它一定也有非空桶,它右侧离它最近非空桶的最小值和它左侧离它最近非空桶的最大值必然相邻,而且这个差值是大于空桶的范围的
这说明:完全不用纠结来自于同一个桶内部的相邻的情况,为啥?同一个桶的相邻数它减完之后差值不会大于桶区间。而你空桶左右两侧的最小值和最大值,它一定会超过桶区间,我们杀死了一票可能性,即来自一个桶内部的相邻数一律可以不需要考虑
每一个桶只维持自己这个桶里的最小值跟最大值,其它数一律不要
每一个桶三个数据

代码

public static int maximumGap(int[] nums) {
        if (nums == null || nums.length < 2) {
            return 0;
        }
        int len = nums.length;
        int min = Integer.MAX_VALUE;
        int max = Integer.MIN_VALUE;
        for (int i = 0; i < len; i++) {
            min = Math.min(min, nums[i]);
            max = Math.max(max, nums[i]);
        }
        if (min == max) {
            return 0;
        }
        boolean[] hasNum = new boolean[len + 1];
        int[] maxs = new int[len + 1];
        int[] mins = new int[len + 1];
        int bid = 0;
        for (int i = 0; i < len; i++) {
            bid = bucket(nums[i], len, min, max);
            mins[bid] = hasNum[bid] ? Math.min(mins[bid], nums[i]) : nums[i];
            maxs[bid] = hasNum[bid] ? Math.max(maxs[bid], nums[i]) : nums[i];
            hasNum[bid] = true;
        }
        int res = 0;
        int lastMax = maxs[0];
        int i = 1;
        for (; i <= len; i++) {
            if (hasNum[i]) {
                res = Math.max(res, mins[i] - lastMax);
                lastMax = maxs[i];
            }
        }
        return res;
    }

    public static int bucket(long num, long len, long min, long max) {
        return (int) ((num - min) * len / (max - min));
    }
相关文章
|
数据可视化 Linux C++
Python GUI编程:Tkinter与PyQt的选择
Python作为一门流行的编程语言,在GUI编程领域也有着非常强大的工具。其中,Tkinter和PyQt是两个备受推崇的GUI库。本文将介绍这两个库的优缺点,并帮助读者决定应该选择哪一个。
|
资源调度
一天掌握latex论文编辑,从标题作者,段落,数学公式,图片,图表,到参考文献全流程
一天掌握latex论文编辑,从标题作者,段落,数学公式,图片,图表,到参考文献全流程
1814 0
|
12月前
|
人工智能 自然语言处理 搜索推荐
阿里云 AI 搜索产品荣获 Elastic Innovation Award 2024
在新加坡 ElasticON 2025 的 Elastic 合作伙伴峰会上,阿里云 AI 搜索产品荣获 Elastic Innovation Award 2024!
634 1
阿里云百炼大模型服务--模型训练指南
模型训练是通过Fine-tuning训练模式提高模型效果的功能模块,作为重要的大模型效果优化方式,用户可以通过构建符合业务场景任务的训练集,调整参数训练模型,训练模型学习业务数据和业务逻辑,最终提高在业务场景中的模型效果。
1112 0
|
JavaScript Java 测试技术
基于springboot+vue.js的企业资产管理系统附带文章和源代码设计说明文档ppt
基于springboot+vue.js的企业资产管理系统附带文章和源代码设计说明文档ppt
292 8
|
存储 芯片 异构计算
【FPGA】高云FPGA之数字钟实验->HC595驱动数码管(二)
【FPGA】高云FPGA之数字钟实验->HC595驱动数码管
483 4
|
移动开发 安全 小程序
优化 uniapp 发行操作:一键打包、混淆代码
小程序发行后代码会自动打包到unpackage/dist/build文件中(生产环境)unpackage/dist/dev文件是发行旁边的运行按钮打包出来的文件(开发环境)
|
网络协议 Unix
TCP/IP出现的背景及其历史【图解TCP/IP(笔记八)】
TCP/IP出现的背景及其历史【图解TCP/IP(笔记八)】
1717 0
TCP/IP出现的背景及其历史【图解TCP/IP(笔记八)】
西门子S7-1200的运动控制功能、系统使能指令块、错误确认指令块、回参考点或设置参考点指令块的参数含义
今天我们来介绍西门子S7-1200的运动控制功能。西门子S7-1200的运动控制指令是通过使用相关工艺数据块和CPU的专用脉冲串输出来控制轴的运动。
西门子S7-1200的运动控制功能、系统使能指令块、错误确认指令块、回参考点或设置参考点指令块的参数含义