题目链接 : 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. SQL结果统计 GROUP BY

    在结果几种,使用GROUP BY进行相同项求和的时候SELECT的字段要与GROUP BY后面的一一对应. select M.TIME,M.PRODUCTMODEL,M.PROCESS_PRODUCT ...

  2. PHP 字符串相关常识

    0x00 前言 第一次遇见字符串这个概念是在学 C 语言的时候,那时候觉得字符串也没有什么难的,不就是一个以 \0 结尾的 char 数组而已咯.后来在学习 PHP 的过程中也同样保持这个观念,不过在 ...

  3. WEB上传大文件

    众所皆知,web上传大文件,一直是一个痛.上传文件大小限制,页面响应时间超时.这些都是web开发所必须直面的. 本文给出的解决方案是:前端实现数据流分片长传,后面接收完毕后合并文件的思路.下面贴出简易 ...

  4. luogu 4927 [1007]梦美与线段树 概率与期望 + 线段树

    考场上切了不考虑没有逆元的情况(出题人真良心). 把概率都乘到一起后发现求的就是线段树上每个节点保存的权值和的平方的和. 这个的修改和查询都可以通过打标记来实现. 考场代码: #include < ...

  5. 记一次创建svc代理失败

    在看尚硅谷的k8s视频中,学到ingress代理的时候,由于之前按照视频安装了V1.15.1,后面环境又出了问题,重新安装了 16.1的,为这次失败埋下了伏笔. 教案中的yaml apiVersion ...

  6. 大数据笔记(二十八)——执行Spark任务、开发Spark WordCount程序

    一.执行Spark任务: 客户端 1.Spark Submit工具:提交Spark的任务(jar文件) (*)spark提供的用于提交Spark任务工具 (*)example:/root/traini ...

  7. 每日踩坑 2019-07-30 H5 使用 iframe 底部有白边

    用个iframe累死累活的 用 js 动态计算高度, 结果明明px都对,然后却把页面滚动条也整出来了. 查看元素盒模型也一切正常. 然后仔细观察就发现是下边多了几个像素的白色边. 然后就 百度呗 以下 ...

  8. 待处理bug

    https://laravel-china.org/docs/laravel/5.1/installation/1039#installation composer 下载laravel 有问题

  9. sensu

    https://blog.csdn.net/enweitech/article/details/53763324

  10. zabbix 内网监控云服务器

    今天 搞监控碰到了一个问题就是.内网机器搭建的zabbix服务器去监控云服务器agent的时候,agent 需要写服务端的IP地址. 我的思路是内网服务器映射自己公网IP地址的zabbix的端口100 ...