随手练——O(n)解决无序数组排序后的相邻最大差值
题目从这儿看到的 : https://mp.weixin.qq.com/s/2OXg67MfBuQjDPAJxxD8rQ,但是公众号上讲错了,问题还挺严重的。
题目知识点:桶排序。
题目:有一个无序数组2,3,1,4,6,排序后是1,2,3,4,6,最大差值是 6 - 4 = 2。
- 先找到数组的max和min。
- 创建一个长度为N+1的桶,前N个桶,(max-min)/N得到范围,左闭右开,最后一个桶只存储最大值。
- 除去第一个和最后一个,也就是N-1个数往N个桶里放,那么至少会有一个桶为空。(鸽笼原理)
- 遍历新数组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)解决无序数组排序后的相邻最大差值的更多相关文章
- BAT面试题 - 找一个无序实数数组中的最大差值
题目描写叙述: 一个无序的实数数组a[i].要求求里面大小相邻的实数的差的最大值.比方 double a[]={1,5,4,0.2,100} 这个无序的数组,相邻的数的最大差值为100-5=95. 题 ...
- SUBSTRING / CHARINDEX_函数随手练_2
SUBSTRING / CHARINDEX_函数随手练_2环境:MSSQL 2014(AdventureWorks2008R2附加到2014中的表 Location) /* Learning SQL ...
- 压缩Sqlite数据文件大小,解决数据删除后占用空间不变的问题
最近有一网站使用Sqlite数据库作为数据临时性的缓存,对多片区进行划分 Sqlite数据库文件,每天大概新增近1万的数据量,起初效率有明显的提高,但历经一个多月后数据库文件从几K也上升到了近160M ...
- input为disabled提交后得不到该值的解决方法
input的字段当为diabled时时无法获取数值得,所以最近不要用这个,我们可以用readonly带替代,即可解决这类问题 放在form表单中提交后得不到该值. 将disabled=”disable ...
- 解决连接VPN后无法上网问题
解决连接VPN后无法上网问题 VPN的英文全称是“Virtual Private Network”,翻译过来就是“虚拟专用网络”.顾名思义,虚拟专用网络可以把它理解成是虚拟出来的企业内部专线. 在公司 ...
- 解决设置clickablespan后长按冲突的问题
解决设置ClickableSpan后长按冲突的问题 问题描述 3月份修改别人代码的时候想要屏蔽TextView的长按事件,发现TextView有重写OnTouchEvent方法,然后在其中加了长按事件 ...
- 如何解决安装VMware后郑广电宽带客户端不能登录的问题?
如何解决安装VMware后郑广电宽带客户端不能登录的问题? 问题:安装VMware后,郑广电宽带客户端不能登录,提示:“不允许代理上网”. 解决:将VMware的虚拟网卡(VMnet1和VMnet8) ...
- 我的Git教程 之 解决 git clone后无代码
解决 git clone 后无代码 前言:这个教程只适用于像我一样大致理解Git的原理,但是不太记得住Git命令的同学使用.所以具体原理只会提一下,具体可以参见Pro Git. 在另一篇 简明的教程 ...
- 解决重启centos后resolv.conf总被清空的问题
解决重启centos后resolv.conf总被清空的问题 最近在机器上装了虚拟机virtualbox,然后安装了centos6.4,安装了免费主机控制面板virtualmin,在本地机器上搭建测试网 ...
随机推荐
- [javaSE] GUI(jar包双击运行)
首先应该在java文件中定义包名,package 包名 带包编译成class文件 切换到目录下,使用jar -cvf xx.jar 包名,就是把那个包放到xx.jar包里面 此时双击会报错,找不到要执 ...
- C#对Windows服务组的启动与停止
Windows服务大家都不陌生,Windows服务组的概念,貌似MS并没有这个说法. 作为一名软件开发者,我们的机器上安装有各种开发工具,伴随着各种相关服务. Visual Studio可以不打开,S ...
- 简单工厂模式使用ResourceBundle读取.properties配置文件
在做项目时,遇到需要创建DAO.Service等类的实例的时候,想到用工厂方法来运作,而简单工厂方法又有明显的缺点: ①由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中 ...
- DB2 Metadata
http://www.devart.com/dotconnect/db2/docs/MetaData.html Instead of specifying the metadata collectio ...
- sql:Mysql create view,function,procedure
create database Liber; use Liber; #顯示數据庫 20150210 Geovin Du 涂聚文 SHOW DATABASES; drop table BookKindL ...
- CSS3字体火焰燃烧效果
动画的CSS: // fire @keyframes fireDiv { 0% { text-shadow: 0 0 4px white, 0 -5px 4px #ff3, 2px -10px 6px ...
- 测试canvas绘制旋转文字的性能
canvas 绘制各种动画效果时,我们经常会使用画布旋转,使绘制上去的元素有旋转的效果. 最近在项目中碰到了很严重的性能问题,经常排查发现是因为绘制批量文字时使用了画布旋转,且每行文字的旋转角度是不一 ...
- JQ的几组API辨析:
1.插入: Jq的插入一共有八个API可供选择,结果相类似,下面将以例子,简单明了的介绍下用法: <select name="one" multiple="mult ...
- 浏览器根对象window之history
1. history(H5) Window.history保存用户在一个会话期间的网站访问记录,用户每次访问一个新的URL即创建一个新的历史记录. 1.1 length 返回浏览器历史列表中的 URL ...
- 单选按钮(RadioButton)
一:RadioButton的相关属性: 1.Activity //单选按钮 public class RadioButtonActivity extends Activity { private Co ...