题目从这儿看到的 : https://mp.weixin.qq.com/s/2OXg67MfBuQjDPAJxxD8rQ,但是公众号上讲错了,问题还挺严重的。


题目知识点:桶排序。

题目:有一个无序数组2,3,1,4,6,排序后是1,2,3,4,6,最大差值是 6 - 4 = 2。

  1. 先找到数组的max和min。
  2. 创建一个长度为N+1的桶,前N个桶,(max-min)/N得到范围,左闭右开,最后一个桶只存储最大值。
  3. 除去第一个和最后一个,也就是N-1个数往N个桶里放,那么至少会有一个桶为空。(鸽笼原理)
  4. 遍历新数组Array,计算每一个非空桶中的最大值,与下一个非空桶的最小值的差,数值最大的差即为原数组排序后的相邻最大差值。(所以,每个桶只需要记录当前桶的最大值、最小值即可)

  原公众号文章就是第四步错了:

举个简单的例子就知道是不对的了,最大值并不一定出现 在空桶的两侧。

一定会有一个空桶,只能告诉我们:最大差值一定不再同一个桶里。但并不一定在空桶两侧。

代码实现:

#include "tools.h"

int find_Max_Offset(int *a, int length) {
int min = getMin(a, length), max = getMax(a, length);
if (max == min) return ;
bool *exsit = new bool[length + ];
memset(exsit, false, sizeof(bool)*(length + ));
int *MAX = new int[length + ];
int *MIN = new int[length + ]; for (int i = ; i < length; i++) {
int index = (a[i] - min) * length / (max - min);
if (!exsit[index]) {
MAX[index] = MIN[index] = a[i];
exsit[index] = true;
}
else {
MAX[index] = a[i] > MAX[index] ? a[i] : MAX[index];
MIN[index] = a[i] < MIN[index] ? a[i] : MIN[index];
}
} int offset = ;
for (int i = ; i < length;) {
int max = MAX[i++];
while (exsit[i] == false) i++;
int min = MIN[i];
offset = min - max > offset ? min - max : offset;
}
return offset;
}

随手练——O(n)解决无序数组排序后的相邻最大差值的更多相关文章

  1. BAT面试题 - 找一个无序实数数组中的最大差值

    题目描写叙述: 一个无序的实数数组a[i].要求求里面大小相邻的实数的差的最大值.比方 double a[]={1,5,4,0.2,100} 这个无序的数组,相邻的数的最大差值为100-5=95. 题 ...

  2. SUBSTRING / CHARINDEX_函数随手练_2

    SUBSTRING / CHARINDEX_函数随手练_2环境:MSSQL 2014(AdventureWorks2008R2附加到2014中的表 Location) /* Learning SQL ...

  3. 压缩Sqlite数据文件大小,解决数据删除后占用空间不变的问题

    最近有一网站使用Sqlite数据库作为数据临时性的缓存,对多片区进行划分 Sqlite数据库文件,每天大概新增近1万的数据量,起初效率有明显的提高,但历经一个多月后数据库文件从几K也上升到了近160M ...

  4. input为disabled提交后得不到该值的解决方法

    input的字段当为diabled时时无法获取数值得,所以最近不要用这个,我们可以用readonly带替代,即可解决这类问题 放在form表单中提交后得不到该值. 将disabled=”disable ...

  5. 解决连接VPN后无法上网问题

    解决连接VPN后无法上网问题 VPN的英文全称是“Virtual Private Network”,翻译过来就是“虚拟专用网络”.顾名思义,虚拟专用网络可以把它理解成是虚拟出来的企业内部专线. 在公司 ...

  6. 解决设置clickablespan后长按冲突的问题

    解决设置ClickableSpan后长按冲突的问题 问题描述 3月份修改别人代码的时候想要屏蔽TextView的长按事件,发现TextView有重写OnTouchEvent方法,然后在其中加了长按事件 ...

  7. 如何解决安装VMware后郑广电宽带客户端不能登录的问题?

    如何解决安装VMware后郑广电宽带客户端不能登录的问题? 问题:安装VMware后,郑广电宽带客户端不能登录,提示:“不允许代理上网”. 解决:将VMware的虚拟网卡(VMnet1和VMnet8) ...

  8. 我的Git教程 之 解决 git clone后无代码

    解决 git clone 后无代码 前言:这个教程只适用于像我一样大致理解Git的原理,但是不太记得住Git命令的同学使用.所以具体原理只会提一下,具体可以参见Pro Git. 在另一篇 简明的教程  ...

  9. 解决重启centos后resolv.conf总被清空的问题

    解决重启centos后resolv.conf总被清空的问题 最近在机器上装了虚拟机virtualbox,然后安装了centos6.4,安装了免费主机控制面板virtualmin,在本地机器上搭建测试网 ...

随机推荐

  1. 教你用go freetype根据用户昵称生成头像

    最近需要为用户服务添加一些新功能,其中就包括在注册时根据用户昵称生成头像这一点. 由于用户服务是用golang写的,google来google去都只找到freetype一个比较简单好用的库,其他比如I ...

  2. web.xml文件初始化过程

    在使用各种框架后,有时会发现不了了错误处在哪里,了解Servlet的初始化过程(也可以说是web.xml的初始化吧),也许对你对于框架的理解与报错的原因理解会有帮助 context-param > ...

  3. 标准Trie字典树学习二:Java实现方式之一

    特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! 系列文章: 1. 标准Trie字典树学习一:原理解析 2.标准T ...

  4. array(1) { [0]=> int(5) }和array(1) { [0]=> string(1) "5" }

    php array数组: $arrayValue = array(5); $arrayValue = array('5'); 的不同之处 一个是整型一个是字符串型 array(1) { [0]=> ...

  5. SSM maven框架下载简易版

    1.前台一个a标签,写个地址就行了 例如 <a href="${pageContext.request.contextPath}/fileDownLoad">前去下载& ...

  6. Struts2详讲

    一 概述 1.什么是Struts2? Struts2是一个在WebWork框架基础上发展起来开源MVC框架. 2.StrutsPrepareAndExecuteFilter StrutsPrepare ...

  7. react项目跨域问题

    在用知乎写demo的时候碰到了跨域问题 解决跨域如下: 跨域代理解决 "proxy":"https://news-at.zhihu.com",   请求的时候, ...

  8. CentOS配置multipath

    可以通过2种方式查看HBA的WWN信息: 1. 查看sys文件系统 查看HBA卡型号:[root@localhost ~]# lspci  | grep -i fibre13:00.0 Fibre C ...

  9. GoJs实现流程管理图

    GoJS是一个实现交互类图表(比如流程图,树图,关系图,力导图等等)的JS库. 可以加入诸多功能.如流程判断,节点处理等等.GOJS在设计上极大的减轻了开发人员的开发成本.

  10. Android 图片缩略图显示

    //通过openRawResource获取一个inputStream对象 InputStream inputStream = getResources().openRawResource(R.draw ...