相邻两数最大差值

求相邻两数的最大差值。 文章目录一、问题二、解题思路。三、代码实现(Java) 一、问题 给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度O(N),且要求不能用非基于比较的排序。 二、解题思路。 已知数组长度为 n。 遍历数组,找到整个数组中元素的最大值 max 和最小值 min 。 根据找到的 max 和 min,将数组均匀划分为 n + 1 个范围。 遍历数组,根据每个数组元素的值,判断进入对应的范... 阅读详情


有一个整形数组A,请设计一个复杂度为O(n)的算法,算出排序后相邻两数的最大差值。

给定一个int数组A和A的大小n,请返回最大的差值。保证数组元素多于1个。

测试样例:
[1,2,5,4,6],5
返回:2


解析:使用bucket排序思想,把大小为n的数组分成(max-min)/n个区间,显然这个区间是1 ~ n。

映射函数如下:

((num - min) * n / (max - min));

这样写是因为(num-min) / ((max-min) / n) =  ((num - min) * n / (max - min));

比如num=6,min=1,max=6,(6-1) * 5 / (6-1) = 5,所以6在5号桶。这个映射函数决定了桶序号不可能为0,所以编程时要先剔除为0的空桶。

由于在任何一个桶中任何两个数的差值都不可能大于区间差值,而在空桶左右两边不空的桶里,相邻数的差值肯定大于区间值。所以产生最大差值的两个相邻数肯定来自不同的桶。所以只要计算桶之间数的间距就可以,也就是只用记录每个桶的最大值和最小值,最大差值可能来自某个非空桶的最小值减去前一个非空桶的最大值。


代码如下:

class Gap {
public:
    int maxGap(vector<int> A, int n) {
       	if(n < 0 || ((A.size()==0) ^ (n==0)))
            return -1;
               
        int res = 0;
       	if(n < 2)
        	return res;
               
        int max = A[0], min = A[0];
        for(int i=1; i<n; ++i){
            if(A[i] > max)
                max = A[i];
           	if(A[i] < min)
                min = A[i];
        }
        if(max == min)
        	return res;
        
        vector<bool> has_num(n+1, false);   //用来标记是否是非空桶
        vector<int> maxs(n+1, 0);
        vector<int> mins(n+1, 0);
        for(int i=0; i<n; ++i){
            int bucket_id = get_bucket_id(A[i], n, min, max);
            maxs[bucket_id] = has_num[bucket_id] ? std::max(maxs[bucket_id], A[i]) : A[i];
            mins[bucket_id] = has_num[bucket_id] ? std::min(mins[bucket_id], A[i]) : A[i];
            has_num[bucket_id] = true;
        }
        
        int k = 0;
        int last_max = 0;
        while(k <= n){
            if(has_num[k]){
               last_max = maxs[k];   //排除序号为0的空桶,因为前面都是空桶,不是数据,相邻最大差是数据与数据之间的最大差,所以第一个last_max=maxs[k],
               break;                //从下一个mins减去这个last_max开始找出最大的差
            }
           	++k;
        }
        
       	while(++k <= n){
            if(has_num[k]){       //只有非空桶才可以进入,所以res一直为两个非空桶的差
                res = std::max(mins[k]-last_max, res);
                last_max = maxs[k];   //注意更新last_max
            }
        }
        
        return res;
    }
private:
    int get_bucket_id(long long num, long long n, long long min, long long max){   //使用long long类型防止溢出
        return (int)((num - min) * n / (max - min));
    }
};

整段程序的核心就是:

     
       	while(++k <= n){
            if(has_num[k]){       //只有非空桶才可以进入,所以res一直为两个非空桶的差
                res = std::max(mins[k]-last_max, res);
                last_max = maxs[k];   //注意更新last_max
            }
        }

这一段程序通过++k保证了在之前k的基础上加1,has_num[k]保证只有非空桶进入该条件,所以相邻两个非空桶就会进入,并计算res。我们要注意更新last_max。


相邻两数最大差值 -- 算法小结 有一个整形数组A,请设计一个复杂度为O(n)的算法,算出排序后相邻两数的最大差值。给定一个int数组A和A的大小n,请返回最大的差值。保证数组元素多于1个。测试样例: [1,2,5,4,6],5 返回:2编程思路:本题明显就是先排序,后比较相邻数的差值,因此有很多的实现方法,首先就是排序,我们可以选择复杂度较低的算法,这里使用类似桶排序的思想,我们不是以元素的值来计算桶的数目,而是元素个数来划分 阅读详情

相关推荐

Unity URP半透明物体渲染避坑指南:双面渲染与深度写入的实战技巧

本文深入探讨了Unity URP中半透明物体自交叠渲染问题的核心根源与解决方案。针对模型自身交叠导致的排序错误,文章提供了双面渲染与深度写入两种实战技巧,详细分析了其实现原理、性能开销及适用场景,帮助开发者根据项目需求选择最优方案,有效提升玻璃、水体等材质的视觉表现。

sunny的博客 545

求相邻两数的最大差值 c++

题目:给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度O(N),且要求不能用非基于比较的排序。 思路:因为不能使用非基于比较的排序,所以不能应用桶排序后遍历找最大差值。但可以应用桶排序的思想:创建一个比原数组个数加一的桶,数组的最小值放在第0号桶里,数组的最大值放在最后一个桶里,然后遍历数组,桶内只放该区域的最大值和最小值。遍历之后中间一定会有一个空桶,要注意的是空桶的左边的最小值...

weixin_44177074的博客 1845

HFSS 3D LAOUT PCB 裁剪,差分线,过孔仿真和优化

我本身不是做天线设计的,所以HFSS这个软件给我主要还是做PCB级别的高速信号完整性仿真,一般2.5D的仿真软件无法对过孔和跨平面进行仿真。所以要借助三维电磁软件进行。今天就针对PCB进行裁剪。为什么要裁剪?以为如果把整个PCB一起仿真的话,应该要好几个月吧。所以为了加快仿真速度,必须进行裁剪仿真。①candence的PCB可以直接导入。那么先导入brd文件,file-import-candence结果如下②点击cutout,选中要仿真的net和参考平面。这里最好选creat new不然会把原文件覆盖掉。注

gjatwfn的专栏 1万+

C++相邻最大差值

1. 题目描述 相邻最大差值 请设计一个复杂度为O(n)的算法,计算一个未排序数组中排序后相邻元素的最大差值。 给定一个整数数组A和数组的大小n,请返回最大差值。保证数组元素个数大于等于2小于等于500。 测试样例: 输入: [9,3,1,10],4 输出:返回:6 2. 思路 首先求出数组的最大值max和最小值min; 然后将该区间均等的划分为n+1份,即n+1个桶,那么由于只有...

暮日落流年的博客 1664

GitLab教程(四):分支(branch)和合并(merge)

命令进行合并时,Git具备一定的智能自动化处理能力:如果一个分支仅修改了文件A,而另一个分支独立地修改了文件B,Git能够无缝整合这些更改,自动完成合并过程——即最终的代码既包含了对A文件的修改也包含了对B文件的修改。同样地,若两个分支虽然都修改了同一个文件,但涉及的是文件中互不重叠的部分,比如一个改动发生在第一行,另一个则在第二行,Git同样能巧妙地自动合并这些非冲突性修改。获取了远程分支的最新变化,或者当你想要合并本地的一个分支到当前分支时,就会用到这个命令。,默认会尝试合并远程分支到当前分支。

TracyCoder的博客 7888

从机械到数字:EC11旋转编码器与ESP32的PWM控制艺术

本文详细解析了EC11旋转编码器与ESP32的PWM控制技术,探讨了如何将机械旋转动作转换为精确的数字信号控制。通过硬件连接、信号处理和软件优化等实践技巧,开发者可以构建高效的人机交互系统,适用于智能照明、电机控制等多种应用场景。

android的专栏 786

刷题笔记22——求排序后数组相邻两数的最大差值

题目描述 给定一个数组, 求如果排序之后, 相邻两数的最大差值, 要求时间复杂度O(N), 且要求不能用非基于比较的排序。 解法1:暴力法 题目要求时间复杂度为O(N),这意味着我们不能用基于比较的排序方法对数组做排序,因为最快也是O(NlogN)的,但还是做了一下。 方法就是排序了之后用后一个数减前一个数,更新maxGap的值就好了 解法2:利用桶的思想但不排序 这里,数组有N个数,就分N+1...

优快云_dzh的博客 971

uniapp [全端兼容] - 详细实现拍照或相册选取图片后插入水印功能,手机拍照或相册上传图像并添加自定义水印及指定位置显示水印,uniApp给图片加水印后上传到后端服务器或保存到本机相册详细教程!

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,图片水印,上传照片带水印,从相册选择图片加水印功能,拍完照片给图片加水印,添加照片水印,uniapp图片加水印,为图片添加自定义水印,uni-app上传图片并添加水印,上传图片加水印,uni-app如何对拍摄的照片加水印,uni-app实现图片上传添加水印操作,给上传的图片添加上水印,图片加完水印后如何上传到服务器,水印相机,拍照图片加水印,相册选取后给图片加上水印,渲染失败,无法保存,文字水印,日期

🏆 前端领域优质创作者 1万+

一个无序实数数组中的相邻两个元素的最大差值(实数桶排序)

题目描述 求解数组元素在实轴上相邻的2个数之间的最大差值 输入   第一行输入一个正整数N,表示数据的个数   接下来的一行中有N个实数,表示数组中的N个元素,中间以空格分隔 输出:   实轴上相邻的两元素之间差值的最大值 样例输入:    5    2.1  3.1  7.5  1.5  6.3 样例输出:    3.2 要求: 分析所写算法的时间复杂度,如果可能,考虑...

vocaloid01的博客 1999

TI单芯片毫米波雷达1642代码走读(〇)——总纲

前言 近年来,自动驾驶行业发展如火如荼,雷达技术也逐渐从军工封闭圈走向了开放的市场。 毫米波雷达具有全天候探测能力,特别是在雨雪雾天气以及夜间都能可靠工作,并且探测距离相对其他车载传感器非常远,对运动目标非常敏感,价格还低廉,这些特性都使其成为自动驾驶感知层面不可或缺的一环。 现如今的雷达已经不仅仅局限于测距测速测角等传统的功能,雷达技术正在从感知走向认知、从宽带走向超宽带、从二维走向三维四维、从相控阵走向数字阵列、从单通道走向MIMO、从独立工作走向分布式协同、从分立组件走向射频数字一体化。MIMO

3万+

4、海洋哺乳动物运动能量学:潜水与生存的奥秘

本文深入探讨了海洋哺乳动物在潜水与运动中的能量消耗机制,涵盖其生理反应、代谢成本、节能行为策略及测量方法。通过分析不同物种的能量利用特点,揭示了它们如何在极端水下环境中维持能量平衡,并讨论了该研究在保护生物学、生态系统动态和动物健康管理中的实际意义。文章还展望了未来多学科交叉、长期监测及应对环境变化的研究方向,为理解海洋哺乳动物的生存奥秘提供了系统性视角。

p5l2m9n4o6q的博客 116

对一个数组排序之后求相邻数的最大差值

题目: 给定一个整形数组arr,返回排序后的相邻两数的最大差值。 时间复杂度为O(N)。 解答: 如果用排序法实现,其时间复杂度为O(NlogN),而如果利用桶排序的思想(不是桶排序),可以做到O(N),额外空间复杂度为O(N)。遍历arr找到最大值max和最小值min。如果arr的长度为N,准备N+1个桶,把max单独放在第N+1个桶中,[min,max)范围上的数放在1N号桶里,对于1N号桶中...

dream_follower的博客 2228

各向同性、VTI、TTI以及双相介质波场数值模拟

各位读者,大家好!在今天的文章中,我将介绍关于波场数值模拟中的各向同性、VTI(垂直横向等参数介质)、TTI(倾斜横向等参数介质)以及双相介质的基本概念。同时,我也会提供一些基础的Fortran代码片段,供大家了解和学习。

qq_38334677的博客 1711

相邻两数的最大差值

问题:给定一个数组,求如果排序之后,相邻两数的最大差值,要求时 间复杂度O(N),且要求不能用非基于比较的排序。 分析: 如果数组有N个数,则用N+1个桶,加入有数组{5,78,40,30,95},N+1个桶的目的是排除最大差值是在同一个桶中产生,n+1个桶的话至少有一个空桶,但不能说明最大差值位于空桶的左右两个非空桶的之间的差值。 最大差值:相邻两个非空桶,前一个桶的max和后一个桶的min相差...

Cheng 412

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

排序17:相邻两数最大差值

排序17:相邻两数最大差值

小菜鸟也想飞的博客 1631

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

如何得出数组里最大_相邻两数的最大差值(超巧妙解法)

题目:给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度O(N),且不能用非基于比较的排序解法:首先,输入的数组是还没有排好序的,题目要求是不能使用非基于比较的排序而且排序算法的时间复杂度最低都要O(NlogN),这不符合题目要求的时间复杂度O(N),所以我们不能用普通的排序算法去解决该问题。要做到时间复杂度为O(N),那么第一时间想到的就是遍历数组的时候只会对数组遍历一趟。这里给大...

weixin_39638012的博客 1838

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

数组相邻两数最大差值

给定一个数组,求排序之后,相邻两数的最大差值,要求时间复杂度O(N),且要求不能用非基于比较的排序。 思路:因为要求时间复杂度为O(n)且不能用非比较排序,常用的比较排序很难做到O(n)。这里是借助n+1个桶,将n个数平均分配到n个桶里,所以我们所求的最大差值肯定不在一个桶内(只有一个数另说),然后依次求出当前桶最小值与前一个非空桶最大值的差值,求出最大的差值就是我们要的结果。 st...

种一棵树最好的时间是十年前,其次是现在。 606

JAVA语言之相邻两数最大差值

有一个整形数组A,请设计一个复杂度为O(n)的算法,算出排序后相邻两数的最大差值。 给定一个int数组A和A的大小n,请返回最大的差值。保证数组元素多于1个。 测试样例: [1,2,5,4,6],5 返回:2 代码如下: import java.util.*; public class Gap { public int maxGap(int

毛凡的博客 3498
上一篇: 最短排序子数组
下一篇: 判断tl树中是否有与t2树拓扑结构完全相同的子树
FreeeLinux
博客等级 码龄11年 421粉丝 356原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值