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

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

示例 1:

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

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

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

思路:桶排序

把几个数字装进一个桶,每次比较相邻桶的差距,即现在桶的最小值与上一个桶的最小值

那么桶长应该是多少呢?

现在有n个数字,如果他们都是等差的,例如[2,4,6,8],那么每一个间距就是2,如果arr[i]与arr[i-1]的差距变小,那么arr[i]与arr[i+1]差距就变大,所以等差的时候桶的长度是所需最小的。

int t = Math.max(1,(max-min)/(nums.length-1));//桶长    区间长度除以区间个数

int sum = 1+(max-min)/t;    //桶个数    区间长度/桶长

提交的代码:

class  Tong{

int max = -1;

int min = 2147483647>>1;

}

class Solution {

public int maximumGap(int[] nums) {

int max = -1;

int min = 2147483647>>1;

if(nums.length<2)

{

return 0;

}

int i;

for(i=0;i<nums.length;i++)

{

max = Math.max(max,nums[i]);

min = Math.min(min,nums[i]);

}

int t = Math.max(1,(max-min)/(nums.length-1));//桶长

int sum = 1+(max-min)/t;    //桶个数

Tong tong[] = new Tong[sum];

//System.out.println(tong[0].max);

for(i=0;i<nums.length;i++)

{

int x = (nums[i]-min)/t;

if (tong[x] == null)

{

tong[x] = new Tong();

}

tong[x].max = Math.max(nums[i], tong[x].max);

tong[x].min = Math.min(nums[i], tong[x].min);

}

int maxgap=0;

min = 2147483647>>1;

for(i=0;i<sum;i++)

{

if(tong[i]==null)

{

continue;

}

if(min==2147483647>>1)

{

min = tong[i].max;

continue;

}

maxgap = Math.max(maxgap,tong[i].min-min);

min = tong[i].max;

}

return maxgap;

}

}

Leetcode--164. 最大间距相关推荐

  1. LeetCode 164. 最大间距

    思路:先对数组进行基数排序(或桶排序)时间复杂度为N,再遍历比较获取最大间距. public static int maximumGap(int[] nums) {if(nums.length < ...

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

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

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

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

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

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

  5. LeetCode 868. 二进制间距(位运算)

    1. 解题 给定一个正整数 N,找到并返回 N 的二进制表示中两个连续的 1 之间的最长距离. 如果没有两个连续的 1,返回 0 . 输入:22 输出:2 解释: 22 的二进制是 0b10110 . ...

  6. leetcode 868. 二进制间距

    [题目]868. 二进制间距 给定一个正整数 N,找到并返回 N 的二进制表示中两个连续的 1 之间的最长距离. 如果没有两个连续的 1,返回 0 . 示例 1: 输入:22 输出:2 解释: 22 ...

  7. LeetCode——868. 二进制间距

    868. 二进制间距 题目描述 答案 我的代码 官方答案 位运算 题目描述 给定一个正整数 n,找到并返回 n 的二进制表示中两个 相邻 1 之间的 最长距离 .如果不存在两个相邻的 1,返回 0 . ...

  8. LeetCode题解目录

    最新更新于2020.11.27 前往LeetCode主页. 前往GitHub源码.(服务器原因,暂停同步.) 前往码云主页. 已解决 456/1878 - 简单353 中等 90 困难 13 2020 ...

  9. LeetCode-究极刷题【合集】

    文章目录 题目来源LeetCode LeetCode 1. 两数之和-规律 LeetCode 2. 两数相加-链表 LeetCode 3. 无重复字符的最长子串-模板 LeetCode 4. 寻找两个 ...

  10. C#LeetCode刷题-排序

    排序篇 # 题名 刷题 通过率 难度 56 合并区间 31.2% 中等 57 插入区间 30.4% 困难 75 颜色分类 48.6% 中等 147 对链表进行插入排序 50.7% 中等 148 排序链 ...

最新文章

  1. python使用matplotlib可视化subplots子图、subplots绘制子图、子图之间有重叠问题、使用subplots_adjust函数合理设置子图之间的水平和垂直距离
  2. 使用C#实现网站用户登录 (转)
  3. centos7 xfce 中文字体输入法
  4. zabbix监控深信服_Zabbix 远程代码执行漏洞CVE202011800
  5. DELPHI日期时间函数(DateUtils单元)
  6. C++Primer模板
  7. html5 video 播放状态,10分钟了解HTML5的Video标签属性、方法和事件
  8. ae saber插件_AE激光插件Video Copilot Saber安装方法
  9. 漫谈GUI开发—各种平台UI开发概况
  10. JavaScript 将两个数组合并,且删除重复的值
  11. 1stopt拟合步骤_1stopt三维曲线拟合
  12. 如何在CAD图纸中添加文字
  13. matlab做南丁格尔玫瑰图,用VBA做个南丁格尔玫瑰图模板!
  14. 突破封锁——MAC地址欺骗
  15. 《好吗好的》--大冰
  16. 2009 year English Inprovement for IT developments
  17. 决策力--用别人预测自己(3)
  18. RT-Thread Nano移植使用整理
  19. 运放单电源与双电源问题探讨
  20. [python学习中]Linux总结用到的命令

热门文章

  1. 程序员面试金典 - 面试题 10.10. 数字流的秩(map/树状数组)
  2. formdata.append加多个值_redis的五种数据结构和应用场景:微博微信点赞+加购物车等...
  3. android 行布局选择器,『自定义View实战』—— 银行种类选择器
  4. mysql维护计划任务_浅谈MySQL event 计划任务
  5. Django第一天笔记
  6. bigdecimal如何做除法_二胎家庭如何平衡两个孩子的关系?聪明的父母都懂这四个法则...
  7. sql两个时间之间的小时差_2年级学生每天上学路上有两个小时车程,该如何利用好这个时间?-知乎亲子热点快报/2020/09/04...
  8. ICML2021 | Self-Tuning: 如何减少对标记数据的需求?
  9. Spring Boot引起的“堆外内存泄漏”排查及经验总结
  10. Android静态代码扫描效率优化与实践