题目链接 : https://leetcode-cn.com/problems/maximum-gap/

题目描述:

给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。

如果数组元素个数小于 2,则返回 0。

示例:

示例 1:

  1. 输入: [3,6,9,1]
  2. 输出: 3
  3. 解释: 排序后的数组是 [1,3,6,9], 其中相邻元素 (3,6) (6,9) 之间都存在最大差值 3

示例 2:

  1. 输入: [10]
  2. 输出: 0
  3. 解释: 数组元素个数小于 2,因此返回 0

说明:

  • 你可以假设数组中所有元素都是非负整数,且数值在 32 位有符号整数范围内。
  • 请尝试在线性时间复杂度和空间复杂度的条件下解决此问题。

思路:

不用线性时间复杂度,其实就是排序的题!代码如下:

  1. class Solution:
  2. def maximumGap(self, nums: List[int]) -> int:
  3. n = len(nums)
  4. if n < 2: return 0
  5. res = 0
  6. nums.sort()
  7. for i in range(1, n):
  8. res = max(res, nums[i] - nums[i - 1])
  9. return res

下面介绍一下用桶排序的方法:

首先,要知道很关键一点:相邻的最大差值一定不小于该数组的最大值减去最小值除以间隔个数,取上界。即 $ \lceil \frac{max_num - min_num }{ (n - 1)} \rceil $ ,这里的 n 是数组的个数。

我们可以用反证法证明,如果小于,会怎么呢?比如 [1, 2, 5], 利用上式得 \(gap = \frac {5 - 1}{2} = 2\)。如果假设相邻间隔最大为 1,那必然不能组成以上数组!

接下来,我们开始放桶,一个桶里放多少个数呢?我们可以把相邻间隔小于 gap放在一个桶里,那么最大间隔一定在相互桶之间产生!

如何判断这个数在哪个桶里呢?我们用 $ \lfloor { \frac{num - min_num}{gap}}\rfloor$表示 num 在哪个桶里(换句话说,离min_num有几个gap)。我们比如数组为 [1, 2, 3, 4,7],我们排除最大值和最小值, 把其他数组放入桶中,如下图:

  1. | | | |
  2. |23 | | 4 |
  3. |_ _ _| | _ _ _|

同一个桶里,绝对不会出现最大的相邻的差值!

所以,我们只需要比较桶之间的差值,这样我们只需要保持同一桶里的最大值,和最小值即可!

代码如下:

  1. class Solution:
  2. def maximumGap(self, nums: List[int]) -> int:
  3. n = len(nums)
  4. if n < 2: return 0
  5. max_num = max(nums)
  6. min_num = min(nums)
  7. gap = math.ceil((max_num - min_num)/(n - 1))
  8. bucket = [[float("inf"), float("-inf")] for _ in range(n - 1)]
  9. #print(bucket)
  10. # 求出每个桶的最大值,和最小值
  11. for num in nums:
  12. if num == max_num or num == min_num:
  13. continue
  14. loc = (num - min_num) // gap
  15. bucket[loc][0] = min(num, bucket[loc][0])
  16. bucket[loc][1] = max(num, bucket[loc][1])
  17. ##print(bucket)
  18. # 遍历整个桶
  19. preMin = min_num
  20. res = float("-inf")
  21. for x, y in bucket:
  22. if x == float("inf") :
  23. continue
  24. res = max(res, x - preMin)
  25. preMin = y
  26. res = max(res, max_num - preMin)
  27. return res

[LeetCode] 164. 最大间距的更多相关文章

  1. Java实现 LeetCode 164 最大间距

    164. 最大间距 给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值. 如果数组元素个数小于 2,则返回 0. 示例 1: 输入: [3,6,9,1] 输出: 3 解释: 排序后的数组是 ...

  2. [LeetCode] 164. Maximum Gap 求最大间距

    Given an unsorted array, find the maximum difference between the successive elements in its sorted f ...

  3. LeetCode 164. Maximum Gap[翻译]

    164. Maximum Gap 164. 最大间隔 Given an unsorted array, find the maximum difference between the successi ...

  4. Leetcode 868. 二进制间距

    868. 二进制间距  显示英文描述 我的提交返回竞赛   用户通过次数201 用户尝试次数220 通过次数207 提交次数396 题目难度Easy 给定一个正整数 N,找到并返回 N 的二进制表示中 ...

  5. 力扣(LeetCode)二进制间距 个人题解

    输入:6 输出:1 解释: 6 的二进制是 0b110 . 示例 4: 输入:8 输出:0 解释: 8 的二进制是 0b1000 . 在 8 的二进制表示中没有连续的 1,所以返回 0 . 提示: 1 ...

  6. ✡ leetcode 164. Maximum Gap 寻找最大相邻数字差 --------- java

    Given an unsorted array, find the maximum difference between the successive elements in its sorted f ...

  7. Java for LeetCode 164 Maximum Gap

    Given an unsorted array, find the maximum difference between the successive elements in its sorted f ...

  8. leetcode[164] Maximum Gap

    梅西刚梅开二度,我也记一题. 在一个没排序的数组里,找出排序后的相邻数字的最大差值. 要求用线性时间和空间. 如果用nlgn的话,直接排序然后判断就可以了.so easy class Solution ...

  9. LeetCode刷题总结-排序、并查集和图篇

    本文介绍LeetCode上有关排序.并查集和图的算法题,推荐刷题总数为15道.具体考点分析如下图: 一.排序 1.数组问题 题号:164. 最大间距,难度困难 题号:324. 摆动排序 II,难度中等 ...

随机推荐

  1. MySQL报错:Cause: java.sql.SQLException: Incorrect string value: '\xE6\x9D\xA8","...' for column 'obj_value' at row 1

    1.插入MySQL表时,报错:Cause: java.sql.SQLException: Incorrect string value: '\xE6\x9D\xA8","...' ...

  2. Linux培训教程 linux磁盘分区详解

    在学习 Linux 的过程中,安装 Linux 是每一个初学者的第一个门槛.在这个过程中间,最大的困惑莫过于给硬盘进行分区.虽然,现在各种发行版本的 Linux 已经提供了友好的图形交互界面,但是很多 ...

  3. 洛谷 P3049 Landscaping ( 贪心 || DP)

    题意 : 有n块土地,每块有A[i]泥土,现把其改造成B[i]泥土,有3种操作:(1)花费X向任意土地增加1泥土:(2)花费Y向任意土地减少1泥土:(3)花费Z*|i-j|把土地i的1泥土运到土地j. ...

  4. Elastic-Job快速入门

    1 Elastic-Job快速入门1.1 环境搭建1.1.1.版本要求JDK要求1.7及以上版本Maven要求3.0.4及以上版本zookeeper要求采用3.4.6及以上版本1.1.2.Zookee ...

  5. docker-compose进行部署容器的时候,报错权限不足

    刚刚用docker-compose部署elk的时候,没有起来,查看日志的时候,发现在数据卷挂载的时候,报错权限不足. 由于日志不在了,这里就直接贴出解决办法. 问题原因及解决办法 原因是CentOS7 ...

  6. 【bzoj2763】[JLOI2011]飞行路线

    *题目描述: Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一 ...

  7. Ansible跳板机自动部署

    首先,安装ansible,略过此步骤. 一.控制机(jenkens.ansible所在机器与跳板机之间互信,跳板机与目的机之间互信) 1.在客户端生成公钥私钥对 命令:ssh-keygen -t rs ...

  8. Python3学习笔记(九):赋值,浅拷贝和深拷贝区别

    一.变量赋值 在Python可变数据类型(列表,字典,集合)中,把一个可变数据类型的变量赋给另一个变量,这两个变量引用的是同一个对象,内存地址是一样的,修改当中的一个变量,另一个变量相应也会被修改 & ...

  9. mssql的sql注入拿后台

    0x01判断数据 ①判断数据库类型 and exists (select * from sysobjects)--返回正常为mssql(也名sql server) and exists (select ...

  10. android实现异步加载图片类

    其中牵涉到的关键知识点 1,回调机制,不过回调接口的实现方式有多种多样,可以是一个类继承该接口,也可以是作为一个方法参数: 可以参照自己的这篇博客: http://www.cnblogs.com/bo ...