leetcode164. 最大间距 借桶思想秒掉hard题
给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。
如果数组元素个数小于 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.计算机是数学的创造物,又是数学的创造者.(是) 2.抽象得到的新概念与表达原来的对象的概念之间一定有种属关系(否) 3.一个数学理论体系内的每一个命题都必须给出证明(否) 4 ...
- 奇怪的比赛(某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪: 每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答)
题目描述 某电视台举办了低碳生活大奖赛.题目的计分规则相当奇怪: 每位选手需要回答10个问题(其编号为1到10),越后面越有难度.答对的,当前分数翻倍:答错了则扣掉与题号相同的分数(选手必须回答问题, ...
- 每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数
package Java2012大赛; /** /** 某电视台举办了低碳生活大奖赛.题目的计分规则相当奇怪:* 每位选手需要回答10个问题(其编号为1到10),越后面越有难度.答对的,当前分数翻倍: ...
- Leetcode--164. 最大间距
给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值. 如果数组元素个数小于 2,则返回 0. 示例 1: 输入: [3,6,9,1] 输出: 3 解释: 排序后的数组是 [1,3,6,9] ...
- LeetCode 164. 最大间距(桶排序+鸽笼原理)
2020年9月4日 周五 天气晴 [不悲叹过去,不荒废现在,不惧怕未来] 本文目录 桶排+鸽笼原理 想法 代码 参考文献 桶排+鸽笼原理 想法 桶的容量 bucketSize = (maxVal - ...
- leetcode 164. Maximum Gap | 164. 最大间距(桶排序)
题目 https://leetcode.com/problems/maximum-gap/ 题解 桶排序,用数组模拟桶 class Solution {public int maximumGap(in ...
- leetcode 164. 最大间距(桶排序)
给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值. 如果数组元素个数小于 2,则返回 0. 示例 1: 输入: [3,6,9,1] 输出: 3 解释: 排序后的数组是 [1,3,6,9] ...
- .net 解析Transfer-Encoding:chunked 秒掉网上无用方案
昨天在爬数据时,发现某个网站Response.Get过来的数据一直是为空.当时就很奇怪,认真看下了响应头.发现Transfer-Encoding:chunked这个玩意 网上查了下资料 一般情况HTT ...
- 极大化思想/悬线法题集
用于解决最大子矩阵问题 P1387 最大正方形 题意: 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 数据范围:n,m<=100 解法: 悬线法计算出每个点左右上三 ...
最新文章
- vscode中使用js的console配置 - mac
- JavaScript类的问题
- java时间转换 YYYY yyyy
- 物理生力热实验不确定度计算源代码
- ***解决方案的选择
- python爬虫工程师-记录一下自己找“python爬虫工程师实习生”岗位的经历
- 线程本地存储器——Windows核心编程学习手札之二十一
- spring依赖注入_Spring依赖注入技术的发展
- c语言学习-从键盘输入10个字符,按照字典顺序将其排序输出(二维字符数组)
- 如何成为一名优秀的web前端工程师
- Git安装教程(windows)
- el表达式判断不为空_Java学习72天---EL和JSTL表达式学完.
- 行如风 Angular初识
- RandomForest随机森林模型训练
- cfa英语不好的怎么学_英语不好能考CFA吗?看看他是怎么做到的
- Spark入门到精通
- [licode cs交互] 1 android client 连接到token服务器
- 终于把AI换脸的原理搞清了
- 这是一个刚入行程序员的成长
- python代码编辑器
热门文章
- linux更改cxxflags环境变量,在64位的ubuntu 14.04 上开展32位Qt 程序开发环境配置(pro文件中增加 QMAKE_CXXFLAGS += -m32 命令)...
- 编译mediastreamer2/ffmpeg/linphone(x86平台)
- 凤凰os linux界面,让deepin linux系统与凤凰os共用个人目录的方法
- java 正则 栈溢出_关于Java正则引起的StackOverFlowError问题以及解决方案 | 学步园...
- 【转】禁用Chrome和Firefox中自动播放的动画GIF
- C#的变迁史05 - C# 4.0篇
- 将 Fortinet 连接到
- 【转】2015-新思想、新技术、新架构——更好更快的开发现代ASP.NET应用程序
- webstorm 内存溢出怎么弄_webstrom 内存溢出,软件崩溃卡死解决的方法
- CCNA-第九篇-OSPF下+VLAN开篇初介绍