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

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

示例 1:

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

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

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

思路:之前写过,直接复制过来。

问题:

数组排序之后的相邻数的最大差值;

嗯,你可以排序,然后找相邻的最大差值。

但是你觉得这么简单我写他干啥。

最优解:时间复杂度O(N),空间O(1)

那我们开始说这种方法:

1)遍历所有数,找到最小值和最大值:min和max

2)设数组长度为n,我们准备n+1个桶

3)把max放进最后一个桶里,min放到第一个桶里

4)每一个桶都负责放一个范围内的数字,负责的范围大小是(max-min)/n。

(比如长度为10,最小值为10,最大值为110,那么准备11个桶,第一个桶放[10,20)的数字,第二个桶放[20,30)的数字......)

重点来啦:因为有n+1个桶,有n个数字,我们就发现了一个问题:必定会有空的桶

为什么我们一定要有空的桶呢?

这样我们就可以做到:桶内的相邻数字的差,一定没有不同桶之间的数字的差大

有了这个结论我们可以做什么呢?

其实找相邻桶和桶之间的差就好啦,桶内的那些情况根本不用关心

想到这里,我们发现桶里根本不用关心到底有几个数,他们的差是多少,只要记录每个桶的最大值最小值即可。

最后一点小问题啦:对于一个数num,他应该放在哪个桶,最好推个公式吧?
它应该被放在(num-min)*len/(max-min)这个桶里。也不难推。

最后就是写代码啦。

class Solution {public int maximumGap(int[] nums) {if (nums == null || nums.length < 2) {return 0;}int len = nums.length;int min = Integer.MAX_VALUE;int max = Integer.MIN_VALUE;for (int i = 0; i < len; i++) {min = Math.min(min, nums[i]);max = Math.max(max, nums[i]);}if (min == max) {return 0;}boolean[] hasNum = new boolean[len + 1];//记录是否空int[] maxs = new int[len + 1];//桶内最大值int[] mins = new int[len + 1];//桶内最小值int bid = 0;//放入桶中for (int i = 0; i < len; i++) {bid = bucket(nums[i], len, min, max);mins[bid] = hasNum[bid] ? Math.min(mins[bid], nums[i]) : nums[i];maxs[bid] = hasNum[bid] ? Math.max(maxs[bid], nums[i]) : nums[i];hasNum[bid] = true;}int res = 0;int lastMax = maxs[0];int i = 1;//相邻桶求最大差值for (; i <= len; i++) {if (hasNum[i]) {res = Math.max(res, mins[i] - lastMax);lastMax = maxs[i];}}return res;}public int bucket(long num, long len, long min, long max) {return (int) ((num - min) * len / (max - min));}
}

leetcode164. 最大间距 借桶思想秒掉hard题相关推荐

  1. 计算是随着计算机的发明而被人们广泛应用,数学思想与方法 判断题

    数学思想与方法判断题 1.计算机是数学的创造物,又是数学的创造者.(是) 2.抽象得到的新概念与表达原来的对象的概念之间一定有种属关系(否) 3.一个数学理论体系内的每一个命题都必须给出证明(否) 4 ...

  2. 奇怪的比赛(某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪: 每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答)

    题目描述 某电视台举办了低碳生活大奖赛.题目的计分规则相当奇怪: 每位选手需要回答10个问题(其编号为1到10),越后面越有难度.答对的,当前分数翻倍:答错了则扣掉与题号相同的分数(选手必须回答问题, ...

  3. 每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数

    package Java2012大赛; /** /** 某电视台举办了低碳生活大奖赛.题目的计分规则相当奇怪:* 每位选手需要回答10个问题(其编号为1到10),越后面越有难度.答对的,当前分数翻倍: ...

  4. Leetcode--164. 最大间距

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

  5. LeetCode 164. 最大间距(桶排序+鸽笼原理)

    2020年9月4日 周五 天气晴 [不悲叹过去,不荒废现在,不惧怕未来] 本文目录 桶排+鸽笼原理 想法 代码 参考文献 桶排+鸽笼原理 想法 桶的容量 bucketSize = (maxVal - ...

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

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

  7. leetcode 164. 最大间距(桶排序)

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

  8. .net 解析Transfer-Encoding:chunked 秒掉网上无用方案

    昨天在爬数据时,发现某个网站Response.Get过来的数据一直是为空.当时就很奇怪,认真看下了响应头.发现Transfer-Encoding:chunked这个玩意 网上查了下资料 一般情况HTT ...

  9. 极大化思想/悬线法题集

    用于解决最大子矩阵问题 P1387 最大正方形 题意: 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 数据范围:n,m<=100 解法: 悬线法计算出每个点左右上三 ...

最新文章

  1. vscode中使用js的console配置 - mac
  2. JavaScript类的问题
  3. java时间转换 YYYY yyyy
  4. 物理生力热实验不确定度计算源代码
  5. ***解决方案的选择
  6. python爬虫工程师-记录一下自己找“python爬虫工程师实习生”岗位的经历
  7. 线程本地存储器——Windows核心编程学习手札之二十一
  8. spring依赖注入_Spring依赖注入技术的发展
  9. c语言学习-从键盘输入10个字符,按照字典顺序将其排序输出(二维字符数组)
  10. 如何成为一名优秀的web前端工程师
  11. Git安装教程(windows)
  12. el表达式判断不为空_Java学习72天---EL和JSTL表达式学完.
  13. 行如风 Angular初识
  14. RandomForest随机森林模型训练
  15. cfa英语不好的怎么学_英语不好能考CFA吗?看看他是怎么做到的
  16. Spark入门到精通
  17. [licode cs交互] 1 android client 连接到token服务器
  18. 终于把AI换脸的原理搞清了
  19. 这是一个刚入行程序员的成长
  20. python代码编辑器

热门文章

  1. linux更改cxxflags环境变量,在64位的ubuntu 14.04 上开展32位Qt 程序开发环境配置(pro文件中增加 QMAKE_CXXFLAGS += -m32 命令)...
  2. 编译mediastreamer2/ffmpeg/linphone(x86平台)
  3. 凤凰os linux界面,让deepin linux系统与凤凰os共用个人目录的方法
  4. java 正则 栈溢出_关于Java正则引起的StackOverFlowError问题以及解决方案 | 学步园...
  5. 【转】禁用Chrome和Firefox中自动播放的动画GIF
  6. C#的变迁史05 - C# 4.0篇
  7. 将 Fortinet 连接到
  8. 【转】2015-新思想、新技术、新架构——更好更快的开发现代ASP.NET应用程序
  9. webstorm 内存溢出怎么弄_webstrom 内存溢出,软件崩溃卡死解决的方法
  10. CCNA-第九篇-OSPF下+VLAN开篇初介绍