博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Maximum Gap 164
阅读量:4992 次
发布时间:2019-06-12

本文共 1132 字,大约阅读时间需要 3 分钟。

题目描述:

给出一个没有排序的数组,找出这个数组中数字排序之后相邻元素的最大差值

给出的数字都是整数,且范围在32位整数范围内

要求时间复杂,空间复杂度都是线性复杂度


 

题目分析:

最简单的方法就是排序之后,找相邻元素之间的最大差值

但是时间复杂度为 O(nlogn)

 

这个题考察的是排序之后的情况,那么看来还是要适当的排序,考虑到要求复杂度线性,可以用桶排序

将数组中的n个元素,分到n个桶中

桶的宽度定义为 d=(max-min)/n,d也是元素之间的平均差值,

这样一定有排序之后相邻元素之间的差值大于等于d(d是平均差值,总要有个大于平均数的吧,要不就全部相同),所以我们可以不考虑桶内元素之间的差值(因为差值一定小于d)

因为不需要考虑桶内元素之间的差值,每个桶可以只记录一个最大值和一个最小值,每个桶的最大值和下一个有数据的桶的最小值一定是排序之后相邻的

只需要找出每个桶中最大值和下一个有数据的桶中的最小值之间的差值,并取一个最大的差值,就是我们要的结果了


 

代码:

 

1 int maximumGap(vector
&num) { 2 int len=num.size(); 3 if(len<2)return 0; 4 int bucketL[len+1]; 5 int bucketR[len+1]; 6 memset(bucketL,-1,sizeof(bucketL)); 7 memset(bucketR,-1,sizeof(bucketR)); 8 9 int ma=0;10 int mi=(1<<31)-1;11 for(int i=0;i
num[i])mi=num[i];14 }15 double gap=double(ma-mi+1)/len; ///计算gap时要加1是为了让最大的数字落在第len-1个桶中,而不是第len个桶中16 for(int i=0;i
num[i])bucketL[bi]=num[i];21 if(bucketR[bi]==-1)bucketR[bi]=num[i];22 else if(bucketR[bi]

 

转载于:https://www.cnblogs.com/li-xingtao/p/4235786.html

你可能感兴趣的文章
将已有的工程项目添加到Xcode到Git管理中
查看>>
吴裕雄 实战PYTHON编程(8)
查看>>
xhtml
查看>>
poj 1113 Wall (凸包模板题)
查看>>
cf 535B Tavas and SaDDas
查看>>
OO-面对对象的特征--多态、抽象
查看>>
看准网免登陆查看
查看>>
用pygame实现打飞机游戏-1-搭建框架
查看>>
io编程,bio,nio,aio
查看>>
windows 关于时间的计算
查看>>
面向对象编程思想-代理模式
查看>>
HttpClient获取Cookie的两种方式
查看>>
Windows 7中的电源计划及维护
查看>>
Spring MVC 配置类 WebMvcConfigurerAdapter
查看>>
js获取url参数
查看>>
程序员如何优雅的挣零花钱?
查看>>
推荐 2 个简历模板及 2 大加分技巧
查看>>
关于伪类选择器中一个冒号和两个冒号的区别
查看>>
理解敏捷开发准则
查看>>
[beta cycle]daily scrum10_2.25
查看>>