算法——O(n)解决无序数组排序后的相邻最大差值

题目从这儿看到的 : 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的桶,第一个桶存储最小值,最后一个桶存储最大值。
  3. 除去第一个和最后一个,也就是N-2个数往N-1个桶里放,那么至少会有一个桶为空。
  4. 遍历新数组Array,计算每一个非空桶中的最小值,与下一个非空桶的最大值的差,数值最大的差即为原数组排序后的相邻最大差值。(所以,每个桶只需要记录当前桶的最大值、最小值即可)

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

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

代码实现:

int find_Max_Offset(int *a,int length) {
    int min = getMin(a, length), max = getMax(a, length);
    if (max == min) return 0;
    int **bucket = new int*[length + 1];
    for (int i = 0; i < length + 1; i++) {
        bucket[i] = new int[3];
        bucket[i][0] = 0;
    }

    bucket[0][0] = 1;
    bucket[0][1] = bucket[0][2] = min;
    bucket[length][0] = 1;
    bucket[length][1] = bucket[length][2] = max;
    for (int i = 1; i < length; i++) {
        int index = ( a[i] - min) * length / (max - min);
        if (!bucket[index][0]) {
            bucket[index][0] = 1;
            bucket[index][1] = a[i];
            bucket[index][2] = a[i];
        }
        else {
            bucket[index][1] = a[i] > bucket[index][1] ? a[i] : bucket[index][1];
            bucket[index][2] = a[i] < bucket[index][2] ? a[i] : bucket[index][2];
        }
     }

    int offset = 0;
    for (int i = 0; i < length; i++) {
        int max = bucket[i++][1];
        while (bucket[i][0] == 0) i++;
        int min = bucket[i][2];
        offset = (min - max) > offset ? (min - max) : offset;
    }
    return offset;
}

原文地址:https://www.cnblogs.com/czc1999/p/10344077.html

时间: 2024-11-10 15:41:41

算法——O(n)解决无序数组排序后的相邻最大差值的相关文章

解决禁用用户后,用户还能登录邮箱问题

1微软官方确认这个问题为产品设计原因,无法进行调整. 2此问题共有如下两种解决方法,但只是加快生效速度: 方法一:重启前端方问服务器角色的iis服务,强制所有客户端断开一次连接.(此方法风险较大) 方法二:采用Set-CASMailbox -Identity <待禁用用户名> -OWAEnabled:$false -ActiveSyncEnabled:$false -EwsEnabled:$false -MAPIBlockOutlookRpcHttp:$true -MAPIEnabled:$f

使用live delegate on来解决js对后加载的html失效的问题

今天要写一个前端的东西.每多学一点知识,就可以少写几行代码.几十行代码.几个文件量的代码--这是真的.一直对前端的研究都是停留在遇到问题百度谷歌答案的做法.今天遇到这样一个问题:已经写好的js代码,对ajax加载的html失效了. 用好几组关键字都没有找到答案,最后这组帮我找到了解答的办法: javascript not work on ajax content 很幸运,我来到了:http://stackoverflow.com/questions/10161938/jquery-functio

解决session过期后登录页面嵌套在框架中的问题

只要在登录页面中加入一下脚本即可: <script language="text/javascript"> //在嵌套时,就刷新上级窗口 if(window.parent!=window){ window.parent.location.reload(true); } </script> 解决session过期后登录页面嵌套在框架中的问题,布布扣,bubuko.com

overflow解决float浮动后高度自适应问题

也许你在做网页的时候发现,发一个区块内的元素被应用了float之后,那么整个box的高度对就不以被浮动对象的高度为标准了.如图中的城市导航内的城市列表中采用了float之后,那个外框的高度并不是内容元素的高度: 怎么解决这个问题呢?经发现可以采用overflow来解决!方法是在父元素加上如下代码即可 overflow:auto; zoom:1; overflow:auto;是让高度自适应, zoom:1;是为了兼容IE6,也可以用height:1%;的方式来解决. 1 1 <!DOCTYPE h

[添加用户]解决useradd 用户后没有添加用户Home目录的情况,Linux改变文件或目录的访问权限命令,linux修改用户密码,usermod的ysuum安装包。飞

usermod的yum安装包: shadow-utils 将nobody用户添加到nogroup 组: usermod -g nogroup nobody cat /etc/passwd|grep nobody nobody:x:65534:65534:nobody:/var/lib/nobody:/bin/bash 第3个字段是65534:意思就是,UID(用户的ID)是500. 第4个字段是65534:意思就是.GID(用户的组ID)的500. 使用usermod -g nogroup no

解决41版后chrome菜单标题不支持mactype的方法

chrome升级后,采用directwrite,导致mactype无法对chrome进行字体渲染,根据前人的成果,解决方法总结如下: 1.chrome://flags/#disable-direct-write 启用 此项可以解决网页字体渲染问题 2.chrome快捷方式启动参数添加 --disable-directwrite-for-ui 此项可以解决菜单标题问题,但是仅此快捷方式有效 3.注册表修改添加--disable-directwrite-for-ui 可以完美解决chrome启动后的

CSS: 解决Div float后,父Div无法高度自适应的问题

在用CSS+DIV的布局中,经常会发现,当一个DIV float之后,如果他的高度超过了其父DIV的高度时,其父DIV的高度并不会相应的进行调整.要解决这个问题(也叫做闭合(清除)浮动),我们有四种办法: 1. 额外标签法 这种方法就是向父容器的末尾再插入一个额外的标签,并令其清除浮动(clear)以撑大父容器.这种方法浏览器兼容性好,没有什么问题,缺点就是需要额外的(而且通常是无语义的)标签.我个人比较喜欢这种方法,因为它简单.实用.浏览器兼容性好,而且这种方法也是W3C推荐的方法 <div

算法6-2:解决哈系冲突之独立链表

独立链表是解决哈希冲突的一种办法.它的基本思想就是将哈希值相互冲突的几个对象放到一个链表中. 代码 public class HashST<Key, Value> { private static class Node { Object key; // 由于无法创建泛型数组,只能将对象设置为Object类 Object value; Node next; public Node(Object key, Object value, Node next) { this.key = key; thi

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

input的字段当为diabled时时无法获取数值得,所以最近不要用这个,我们可以用readonly带替代,即可解决这类问题 放在form表单中提交后得不到该值. 将disabled=”disabled” 改为 readonly = “readonly” 即可 按照W3C的规范:http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.12 设置为disabled的input将会有下面的限制: 不能接收焦点 使用tab键时将被跳过 可能不是