题目:
Given an unsorted array, find the maximum difference between the successive elements in its sorted form.

Try to solve it in linear time/space.

Return 0 if the array contains less than 2 elements.

You may assume all elements in the array are non-negative integers and fit in the 32-bit signed integer range.

解答:
这题挺难理解的,但是可以举例,比如说现在有1, 3, 5, 9。那么我们可以把它分成3个bucket来装,min表示在这个bucket范围中,存在的最小数和最大数。这个bucket的长度是最小可能的最大差值。(如果哪个差值比这个还小,那么为了填补这个小差值,就必然存在另一个差值比它大,那么这个数组的最大差值就比当前bucket大。所以均分下来的bucket是最小可能的最大差值)

b0: (1, 3) min = Integer.max, max = Integer.min
b1: (4, 6) min = Integer.max, max = Integer.min
b2: (7, 9) min = Integer.max, max = Integer.min

然后我们来看这个数组里的数在哪个bucket里,用(nums(i) - min) / gap来得到,
第一个数1在b0中,所以我们更新:
b0: (1, 3) min = 1, max = 1;
第二个数3在b0中,所以我们更新:
b0: (1, 3) min = 1, max = 3;
第三个数5在b1中,所以我们更新:
b1: (4, 6) min = 5, max = 5;
.
.
依次这样下去。
因为每个bucket中的最大值-最小值就是我们最小的gap, 所以我们不用计算相邻的两个数,我们只要比较后一个bucket中的最小值和前一个bucket中的最大值相差多少,取最大相差的值就是最终的结果。注意考虑min和max两个边界值也要加进去。

public int maximumGap(int[] nums) {if (nums == null || nums.length < 2) return 0;int len = nums.length;int max = nums[0], min = nums[0];for (int i = 0; i < nums.length; i++) {max = Math.max(max, nums[i]);min = Math.min(min, nums[i]);}//Math.ceil与最小的比这个数大的蒸熟,使bucket可以包含所有数int gap = (int)Math.ceil((double)(max - min) / (len - 1));int[] BucketsMIN = new int[len - 1];int[] BucketsMAX = new int[len - 1];Arrays.fill(BucketsMIN, Integer.MAX_VALUE);Arrays.fill(BucketsMAX, Integer.MIN_VALUE);for (int num : nums) {//不考虑边界,所以把边界的min和max都拿出来,单独再考虑if (num == min || num == max) continue;int bucket = (num - min) / gap;BucketsMIN[bucket] = Math.min(BucketsMIN[bucket], num);BucketsMAX[bucket] = Math.max(BucketsMAX[bucket], num);}int result = 0;int previous = min;for (int i = 0; i < len - 1; i++) {if (BucketsMIN[i] == Integer.MAX_VALUE && BucketsMAX[i] == Integer.MIN_VALUE) {continue;}result = Math.max(result, BucketsMIN[i] - previous);previous = BucketsMAX[i];}result = Math.max(result, max - previous);return result;}

164. Maximum Gap相关推荐

  1. 164. Maximum Gap 1

    164. Maximum Gap 1. 题目 Given an unsorted array, find the maximum difference between the successive e ...

  2. leetcode 164. Maximum Gap | 164. 最大间距(桶排序)

    题目 https://leetcode.com/problems/maximum-gap/ 题解 桶排序,用数组模拟桶 class Solution {public int maximumGap(in ...

  3. kali linux 2019教程,[教程]KALI LINUX 2.0 2019 更新国内源

    2019年最新版本KALI 为 KALI 2019.1 下载地址:https://www.kali.org/downloads/ 有的新入门的朋友可能会问,为什么每次都无法手动更新 例如:Update ...

  4. LEETCODE-刷题个人笔记 Python(1-400)-TAG标签版本

    1. Array (1) 27. Remove Element(Easy) 给定数组nums和值val,在适当位置删除该值的所有实例并返回新长度. 思路: 不需要使用排序,如果等于该值,则将n-1的值 ...

  5. LeetCode github集合,附CMU大神整理笔记

    Github LeetCode集合 本人所有做过的题目都写在一个java项目中,同步到github中了,算是见证自己的进步.github目前同步的题目是2020-09-17日之后写的题.之前写过的题会 ...

  6. LeetCode解题报告汇总

    LeetCode解题报告: [LeetCode]1.Two Sum - Yoona - 博客频道 - CSDN.NET [LeetCode]2.Add Two Numbers - Yoona - 博客 ...

  7. LEETCODE-刷题个人笔记 Python(1-400)

    按tag分类,250/400的重点题目 LEETCODE-刷题个人笔记 Python(1-400)-TAG标签版本 1.Two Sum(easy) 给定一个整型数组,找出能相加起来等于一个特定目标数字 ...

  8. 算法原理系列:木桶排序

    算法原理系列:木桶排序 木桶排序是一种用标记来替代比较操作的排序手段,适用范围较窄,但效率极高,时间复杂度为 O(n) O(n),在生活中,我们也经常能看到一些木桶排序的实际案例,比如扑克牌排序时,我 ...

  9. LeetCode All in One 题目讲解汇总(持续更新中...)

    原文地址:https://www.cnblogs.com/grandyang/p/4606334.html 终于将LeetCode的大部分题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开 ...

最新文章

  1. Openstack_通用技术_RPC 远程异步调用
  2. 电脑不能访问服务器指定端口6,windows server2008 无法访问本机及其他服务器的所有端口...
  3. nginx 转发慢_学习Nginx的正确姿势,多图详解助你更上一层楼!(干货收藏篇)...
  4. Python Django模板页面自定义过滤器实现md语法及字符串切割代码示例
  5. (100)FPGA单沿和双沿采样(下降沿采样)
  6. python面试1000题之1-3
  7. 动态创建数据表php,PHP实现动态添加XML中数据的方法
  8. DSOFramer使用说明(转载)))
  9. 【原创】打造基于Dapper的数据访问层
  10. DWR学习笔记--转载
  11. 基于javaswing实现PC端课堂点名程序详细设计
  12. TCP/IP协议簇中三个常见的传输层协议
  13. 美国车联网(V2X)发展现状与反思
  14. 计算机网络树形结构例子,网络拓扑结构大全和实例
  15. pascal方格稿纸
  16. 老板问指标下降了,我到底应该怎么分析?!
  17. 如何安装arm交叉工具链及问题解决
  18. BUUCTF pwn 安洵杯_2018_neko
  19. 如何在推荐系统中玩转知识图谱
  20. python爬取微信小程序(实战篇)_python爬取猫眼的前100榜单并展示在微信小程序

热门文章

  1. C和汇编混合编程----实现浮点数的加减乘除
  2. matlab中将数据保存为txt文件_matlab中将数据输出保存为txt格式文件的方法 (1)
  3. Android手机隐藏命令大全
  4. VMware的屏幕太小
  5. linux查漏补缺之常用命令
  6. 使用Automake和Autoconf生成Makefile
  7. Linux下使用socket传输文件的C语言简单实现
  8. linux内核netfilter模块分析之:HOOKs点的注册及调用
  9. mmap父子进程间通信
  10. 保驾护航金三银四,100%好评!