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

如果数组元素个数小于 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 {public int maximumGap(int[] nums) {int n = nums.length;if (n < 2) return 0;int max = Arrays.stream(nums).max().getAsInt();int min = Arrays.stream(nums).min().getAsInt();//划分区间int gap = Math.max((max - min)/(n - 1),1);//找出最小的区间间隔int size = (max - min) / gap + 1;//桶的数量int[][] bucket = new int[size][2];for (int i = 0; i < size; i++) Arrays.fill(bucket[i], -1);//空桶设为-1for (int i = 0; i < n; i++) {int cur = (nums[i] - min) / gap;//当前元素所要放置的桶的序号if (bucket[cur][0] == -1) {//桶是空的,直接插入bucket[cur][0] = bucket[cur][1] = nums[i];} else {bucket[cur][0] = Math.min(nums[i], bucket[cur][0]);//更新桶内的最大最小值bucket[cur][1] = Math.max(nums[i], bucket[cur][1]);}}int res =0, pre = -1;for (int i = 0; i < size; i++)//遍历所有桶,找出桶间最大间隔,空桶忽略不计{if(bucket[i][0]==-1) continue;if(pre!=-1) res= Math.max(res,bucket[i][0]-bucket[pre][1]);pre=i;}return res;}
}

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. Maximum Gap | 164. 最大间距(桶排序)

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

  4. LeetCode 1282. 用户分组(桶排序思想)

    1. 题目 有 n 位用户参加活动,他们的 ID 从 0 到 n - 1,每位用户都 恰好 属于某一用户组.给你一个长度为 n 的数组 groupSizes,其中包含每位用户所处的用户组的大小,请你返 ...

  5. Python 桶排序

    Python 桶排序 线性排序: 线性排序即排序算法的时间复杂度是线性的,也就是 O(n).桶排序.计数排序.基数排序这三个算法是不基于比较的排序算法,都不涉及元素之间的比较操作. 桶排序(Bucke ...

  6. 堆排序时间复杂度_leetcode刷题(二):排序算法(归并排序,堆排序,桶排序)...

    今天,我们要来讲讲排序问题,这次讲的排序算法主要是归并排序,堆排序和桶排序. 归并排序 归并一词在中文的含义就是"合并,并入"的意思,在数据结构里面就是将两个或者两个以上的有序数组 ...

  7. 函数传参问题,桶排序去重,分治递归,摩尔投票求数组众数,数组中心下标求法

    TIPS 1. 我们都知道,地址,指针这两者是完全等价的概念,但是有微小的差别.地址的话是不能够修改的(比如说数组名++就是违法的),而指针的话可以++与--. 2. 以后一旦在代码里面看到字符cha ...

  8. 桶排序算法——C++

    桶排序算法是"分治法"的典型应用,主要思路是先"分桶"(或建捅)再"合桶".其中最关键的是"分桶",这一步最佳的时将整个 ...

  9. python 实现桶排序

    前言 桶排序(Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶里.每个桶再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序).桶排序是鸽 ...

最新文章

  1. 垃圾回收器算法之引用计数器法
  2. 【TensorFlow】TF-tf.nn.dropout
  3. PHP分页的limit与offset
  4. php数组合并 要保持两个数组的键名都不变
  5. Java中Int转byte分析
  6. [Java并发编程实战] 简介
  7. python编程入门第九讲,小甲鱼python视频第九讲(课后习题)
  8. win10无法安装软件,点击大部分exe文件无反应,无提示(安装了火绒)
  9. Java编码规范总结
  10. 新手CrossApp 之IndicatorView小结
  11. linux进程假死的原因_谈谈 Linux 假死现象
  12. Nmap扫描和识别服务
  13. 神器 | 百度云资源搜索
  14. Scrapy 入门教程
  15. tftpd32.exe的安装
  16. Spring Cloud(14)——Function
  17. 广工计算机组成原理考试,广工计算机组成原理期末考试B卷(杨卫平)
  18. echarts的应用
  19. DynamoDB系列之--本地二级索引
  20. C语言 - 运输公司对用户计算运输费用。路程(s km)越远,每吨·千米运费越低。(用switch实现)

热门文章

  1. 【Linux网络编程学习】阻塞、非阻塞、同步、异步以及五种I/O模型
  2. UNIX网络编程笔记(1):TCP简介
  3. jquery $(this)和this
  4. js包装类型的装箱拆箱
  5. 【转】消息队列应用场景
  6. python 图像处理(从安装Pillow开始)
  7. 云说的到底对不对,京东到底行不行?
  8. 实现pick和reigister
  9. Visual Basic.NET中访问数据的方法(zz)
  10. C#操作静态路由表(增、删、改、查、遍历)