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

题目描述:

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

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

示例:

示例 1:

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

示例 2:

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

说明:

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

思路:

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

class Solution:
def maximumGap(self, nums: List[int]) -> int:
n = len(nums)
if n < 2: return 0
res = 0
nums.sort()
for i in range(1, n):
res = max(res, nums[i] - nums[i - 1])
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],我们排除最大值和最小值, 把其他数组放入桶中,如下图:

|     |      |      |
|2,3 | | 4 |
|_ _ _| | _ _ _|

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

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

代码如下:

class Solution:
def maximumGap(self, nums: List[int]) -> int:
n = len(nums)
if n < 2: return 0
max_num = max(nums)
min_num = min(nums)
gap = math.ceil((max_num - min_num)/(n - 1))
bucket = [[float("inf"), float("-inf")] for _ in range(n - 1)]
#print(bucket)
# 求出每个桶的最大值,和最小值
for num in nums:
if num == max_num or num == min_num:
continue
loc = (num - min_num) // gap
bucket[loc][0] = min(num, bucket[loc][0])
bucket[loc][1] = max(num, bucket[loc][1])
##print(bucket)
# 遍历整个桶
preMin = min_num
res = float("-inf")
for x, y in bucket:
if x == float("inf") :
continue
res = max(res, x - preMin)
preMin = y
res = max(res, max_num - preMin)
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. Python使用XML操作mapnik,实现复杂标注(Multi line text symbolizer)

    test.py import mapnik stylesheet = 'world_style.xml' image = 'world_style.png' m = mapnik.Map(1200, ...

  2. spring mvc @Valid 数据验证

    //对书的单价校验不能是空,价格在20-100之间   @DecimalMax(value = "100", message = "价格不超过100元")   ...

  3. vue学习-day04(路由)

    目录: 1.组件传值-父组件向子组件传值和data与props的区别    2.组件传值-子组件通过事件调用向父组件传值          3.案例:发表评论.使用ref获取DOM元素和组件引用   ...

  4. 浅谈Vue中Slot以及slot-scope

    vue中关于插槽的文档说明很短,语言又写的很凝练,再加上其和methods,data,computed等常用选项使用频率.使用先后上的差别,这就有可能造成初次接触插槽的开发者容易产生“算了吧,回头再学 ...

  5. Ansible跳板机自动部署

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

  6. Spring Boot教程(二)关于RabbitMQ服务器整合

    准备工作 15min IDEA maven 3.0 在开始构建项目之前,机器需要安装rabbitmq,你可以去官网下载,http://www.rabbitmq.com/download.html ,如 ...

  7. sqli-lab(15)

    要考四级了 翻译过来就是 基于时间的单引号盲注 0X01盲注 的了解 https://www.cnblogs.com/ldhbetter/p/9201840.html 这里写的清清楚楚 A 先拆解长度 ...

  8. [CSP-S模拟测试]:彩球问题(记忆化搜索)

    题目传送门(内部题91) 输入格式 第一行一个正整数$N$,表示颜色种类数. 第二行$N$个正整数$k[i],k[i]$表示第$i$种颜色的数量$(1\leqslant k[i]\leqslant 3 ...

  9. c++函数相关

    1,内连函数 inline 返回值类型 函数名(形参列表) 普通函数成为内连函数:在普通函数声明之前加上inline 成员函数成为内连函数:在类中定义的函数全部默认为内连函数,可以显示加上inline ...

  10. onCreateViewHolder方法加载了子项的布局

    <?xml version="1.0" encoding="utf-8"?> <RelativeLayout android:layout_w ...