题目:

给定一个整形数组arr,返回排序后的相邻两数的最大差值。

时间复杂度为O(N)。

解答:

如果用排序法实现,其时间复杂度为O(NlogN),而如果利用桶排序的思想(不是桶排序),可以做到O(N),额外空间复杂度为O(N)。遍历arr找到最大值max和最小值min。如果arr的长度为N,准备N+1个桶,把max单独放在第N+1个桶中,[min,max)范围上的数放在1~N号桶里,对于1~N号桶中的每一个桶来说,负责的区间为(max-min)/N。如果一个数为num,它应该分配进(num-min)*len/(max-min)。

arr一共有N个数,旻、一定会放进1号桶中,max一定会放进最后的桶中,所以,如果把所有的数放进N+1个桶中,必然有桶是空的。产生最大差值的相邻数来自不同桶。所以只要计算桶之间数的间距可以,也就是只用记录每个桶的最大值和最小值,最大差值只可能来自某个非空桶的最小值减去前一个非空桶的最大值。

public static int maxGap(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 = 0;
     int i = 0;
     while (i <= len) {
         if (hasNum[i++]) { //找到第一个不为空的桶
             lastMax = maxs[i - 1];
             break;
         }
     }
     for (; i <= len; i++) {
         if (hasNum[i]) {
             res = Math.max(res, mins[i] - lastMax);
             lastMax = maxs[i];
         }
     }
     return res;
 }
     //使用long类型是为了防止相乘时溢出
 public static int bucket(long num, long len, long min, long max) {
     return (int) ((num - min) * len / (max - min));
 }

转载于:https://www.cnblogs.com/xiaomoxian/p/5189782.html

[算法]数组排序之后相邻数的最大差值相关推荐

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

    数组排序之后相邻数的最大差值 题目描述 给定一个整形数组arr,返回排序后相邻两数的最大差值 arr = [9, 3, 1, 10].如果排序,结果为[1, 3, 9, 10],9和3的差为最大差值, ...

  2. 求数组排序后相邻数的最大差值

    /** * 求数组排序后相邻数的最大差值 * @author Administrator * {9,3,1,10} 返回6 */ public class test12 { public static ...

  3. 给定一个未排序的数组,求如果数组排序之后,相邻数的最大差值。

    给定一个未排序的数组,求如果数组排序之后,相邻数的最大差值.要求时间复杂度为O(n),且要求不能用非基于比较的排序. 首先,这个问题明显限制了不能使用直接排序的方式求解.因为基于比较的排序时间复杂度最 ...

  4. 对一个数组排序之后求相邻数的最大差值

    题目: 给定一个整形数组arr,返回排序后的相邻两数的最大差值. 时间复杂度为O(N). 解答: 如果用排序法实现,其时间复杂度为O(NlogN),而如果利用桶排序的思想(不是桶排序),可以做到O(N ...

  5. 数据排序之后相邻数的最大差值

    我发表的文章不多,经验可能不够,大家有什么建议或者问题欢迎来评论,大家互相学习,共同进步. 问题及分析 1.给定一个整型数组arr,返回排序后的相邻两数的最大差值:数组的长度为N,要求时间复杂度为O( ...

  6. 如何得出数组里最大_相邻两数的最大差值(超巧妙解法)

    题目: 给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度O(N),且不能用非基于比较的排序 解法: 首先,输入的数组是还没有排好序的,题目要求是不能使用非基于比较的排序而且排序算法的时 ...

  7. 给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度O(N),且要求不能用非基于比较的排序。

    给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度O(N),且要求不能用非基于比较的排序. import java.util.Arrays;public class MaximumDif ...

  8. 实现输入10个数,输出这10个数的和,平均值;输出该组数中数与数的最大差值;再输入一个数,然后确定它在这个数组中第一次出现的位置,如果没有该数则输出-1,否则输出其下标

    实现输入10个数,输出这10个数的和,平均值:输出该组数中数与数的最大差值:再输入一个数,然后确定它在这个数组中第一次出现的位置,如果没有该数则输出-1,否则输出其下标 int main() //程序 ...

  9. 【算法】—— 相邻两数的最大差值

    题目: 思路: 如果数组长度为N,考虑使用N+1个桶,每个桶能放入数的范围固定,将数组中数据依次放入桶中,那么肯定有一个桶是空桶(因为数一共有N个,而桶有N+1个). 最大差值就出现在相邻两个不为空的 ...

  10. leetcode算法题--增量元素之间的最大差值

    原题链接:https://leetcode-cn.com/problems/maximum-difference-between-increasing-elements/ O(n)记录之前的最小值即可 ...

最新文章

  1. 无意间发现的一个留学mba的论坛
  2. 关于维金病毒和几个维金病毒防治的辅助工具
  3. 2020年电大c语言程序设计作业1答案,2019年最新电大C语言程序设计作业答案.doc
  4. okhttp连接池_OkHttp配置HTTPS访问+服务器部署
  5. 翻身做主--给自己的软件制作注册码
  6. Flask碰到 原因:CORS 头缺少 'Access-Control-Allow-Origin'解决方案 解决
  7. python for循环文件每一行_python – 在使用for循环读取文件时跳过一行
  8. 解决python偶尔读文件报错:UnicodeDecodeError: ‘utf-8‘ codec can‘t decode bytes in position 1022-1023: unex....
  9. 在Python27中运行pip install dlib装载库dlib所引起的问题解决
  10. Dubbo 快速入门教程
  11. 供应链成功绝对离不开的三个要素,你知道吗
  12. 计算机无法登陆提示rpc服务器不可用,电脑rpc服务器不可用,教你电脑rpc服务器不可用怎么解决...
  13. VSCode好用的插件
  14. HTML5实习手机端浏览器拍照和本地上传
  15. 湖北省贷款贴息扶持政策申报指南,2022年申报条件以及贴息奖励标准
  16. 【笔记】win10打开注册表的三种方式
  17. JAVA六大设计原则 和 23种设计模式
  18. C#正则表达式匹配任意字符
  19. js美化alert()弹出框
  20. 数字unicode码

热门文章

  1. 就我不坑2 nyoj(简单模拟)
  2. 关于cad2010的激活
  3. radar nyoj 287
  4. 容器技术Docker K8s 17 容器服务ACK基础与进阶-容器网络管理
  5. 易筋SpringBoot 2.2 | 第三十二篇:Redis Docker入门
  6. 3d安卓环境搭建_RoboCup 仿真3D简介及环境搭建
  7. Dijkstra算法C++实现
  8. tensorflow安装中踩到的坑protobuf、h5py、tensorboard、werkzeug
  9. Android Studio搭建Tensorflow Lite项目和加载tflite模型文件
  10. OTFS Channel Estimation(1)