第一种方法

计数排序后,然后找出两两之间的最大差值

计数排序的时间复杂度是O(N)

public class CountSort {

    public static void main(String[] args) {
int[] arr = new int[] { , , , , , , , , };
sort(arr);
Arrays.stream(arr).forEach(x -> System.out.print(x + " "));
//计算出相邻两个元素的最大差值
int maxGap = Integer.MIN_VALUE;
for(int i = ;i<arr.length ; i++) {
int gap = arr[i]-arr[i-];
if(gap > maxGap) {
maxGap = gap;
}
}
System.out.println();
System.out.println(maxGap);
} public static void sort(int [] arr ) {
//获取最大值和最小值
int min = arr[];
int max = arr[];
for ( int i = ; i < arr.length; i++) {
if(arr[i] < min) {
min = arr[i];
}
if(arr[i] > max) {
max = arr[i];
}
}
//初始化一个桶,并向桶里装数据
int [] bucket = new int[max-min+];
for(int j= ; j<arr.length; j++) {
bucket[arr[j]-min]++;
}
//从桶里取数据,将原数组排序
int index = ;
for(int i = ;i <bucket.length;i++) {
while(bucket[i]-- > ) {
arr[index++] = i+min;
}
}
} }

第二种方法:

1  使用桶的思想,设置N+1个桶,必然有一个空桶,那么就排除了最大差值在一个桶内,因为空桶两侧的差距肯定大于桶内的差距

2 但是最大差值不一定就是空桶左侧max和空桶右侧min,需要依次遍历求差值

public class MaxGap {

    public static void main(String[] args) {
int[] arr = new int[] { , , , , , , , , };
int res = getMaxGap(arr);
System.out.println(res);
} public static int getMaxGap(int [] nums) {
//获取最大值和最小值
int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;
int len = nums.length;
for (int i = ; i < len; i++) {
min = Math.min(min, nums[i]);
max = Math.max(max, nums[i]);
}
if (min == max) {
return ;
}
//假如原数组有N个元素,声明三个长度都是N+1的数组,代表着N+1个桶,序号是从0到n
boolean[] hasNum = new boolean[len + ];
int[] maxs = new int[len + ];
int[] mins = new int[len + ];
//遍历原数组,将数组中的元素分别放到这n+1个桶中
int bid = ;
for (int i = ; 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;
}
//遍历这n+1个桶,将非空桶的最小值和该桶的上一个非空桶的最大值比较,两者之差中的最大值即为所求
int res = ;
int lastMax = maxs[];
for (int i = ; i <= len; i++) {
if (hasNum[i]) {
res = Math.max(res, mins[i] - lastMax);
lastMax = maxs[i];
}
}
return res;
} //计算桶的下标位置
public static int bucket(long num, long len, long min, long max) {
return (int) ((num - min) * len / (max - min));
}
}

给定一个数组,求如果排序后,相邻两个元素的最大差值,要求时间复杂度为O(N)的更多相关文章

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

    题目: 给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度为O(N),且要求不能用非基于比较的排序 public static int maxGap(int nums[]) { if ( ...

  2. [java大数据面试] 2018年4月百度面试经过+三面算法题:给定一个数组,求和为定值的所有组合.

    给定一个数组,求和为定值的所有组合, 这道算法题在leetcode应该算是中等偏下难度, 对三到五年工作经验主要做业务开发的同学来说, 一般较难的也就是这种程度了. 简述经过: 不算hr面,总计四面, ...

  3. CodeForces 702B Powers of Two【二分/lower_bound找多少个数/给出一个数组 求出ai + aj等于2的幂的数对个数】

    B. Powers of Two   You are given n integers a1, a2, ..., an. Find the number of pairs of indexes i,  ...

  4. C语言:计算输出给定数组中每相邻两个元素的平均值的平方根之和。

    //计算输出给定数组中每相邻两个元素的平均值的平方根之和. #include <stdio.h> #include <math.h> ]) { double a,b,s=0.0 ...

  5. 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。

    给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意你不能在买入股票前卖出股票. 示例 ...

  6. 【IT笔试面试题整理】给定一个数组a[N]构造数组b [N]

    [来源]:腾讯2013实习生笔试   给定一个数组a[N],我们希望构造数组b [N],其中b[j]=a[0]*a[1]-a[N-1] / a[j])空间复杂度和O(n)的时间复杂度:除遍历计数器与a ...

  7. js实现随机选取[10,100)中的10个整数,存入一个数组,并排序。 另考虑(10,100]和[10,100]两种情况。

    1.js实现随机选取[10,100)中的10个整数,存入一个数组,并排序. <!DOCTYPE html> <html lang="en"> <hea ...

  8. 手写面试编程题- 数组去重 深拷贝 获取文本节点 设置奇数偶数背景色 JS中检测变量为string类型的方法 第6题闭包 将两个数组合并为一个数组 怎样添加、移除、移动、复制、创建和查找节点? 继承 对一个数组实现随机排序 让元素水平 垂直居中的三种方式 通过jQuery的extend方法实现深拷贝

    第1题==>实现数组去重 通过 new Set(数组名) // var arr = [12, 12, 3, 4, 5, 4, 5, 6, 6]; // var newarr1 = new Set ...

  9. 一个数组求其最长递增子序列(LIS)

    一个数组求其最长递增子序列(LIS) 例如数组{3, 1, 4, 2, 3, 9, 4, 6}的LIS是{1, 2, 3, 4, 6},长度为5,假设数组长度为N,求数组的LIS的长度, 需要一个额外 ...

随机推荐

  1. Spring事务源码解析(二)获取增强

    在上一篇文章@EnableTransactionManagement注解解析中,我们搭建了源码阅读的环境,以及解析了开启Spring事务功能的注解@EnableTransactionManagemen ...

  2. 安装ceres-solver win10遇到Eigen安装的问题

    1.无法打开包括文件: “Eigen/Core”: 去github上下载最新的源码 2.  "The Eigen/Array header does no longer exist in E ...

  3. eclipse安装sts

  4. 高性能的编程IO与NIO阻塞分析

    1.什么是阻塞,什么是非阻塞? 阻塞:结果返回之前,线程一直被挂起. 非阻塞:做一件事,尝试去做 2.传统IO模型 socket编程:

  5. fastadmin CMS等系列插件安装不成功的问题

    由于fastadmin开发者  没有做到权限优化问题,导致用户在linux服务器上lnmp环境下安装的fastadmin后台安装插件一直产生权限不足,安装不成功的问题, 再次给大家一个具体解决办法 对 ...

  6. 豆瓣读书isbn 查询

    最近学习微信小程序,做一个类似"书库"的小demo,大致流程使用摄像头获取书本后面的isbn,通过豆瓣读书API得到书本介绍.豆瓣评分.图书评论等信息,然鹅https://api. ...

  7. Two-Stream Adaptive Graph Convolutional Network for Skeleton-Based Action Recognition

    Two-Stream Adaptive Graph Convolutional Network for Skeleton-Based Action Recognition 摘要 基于骨架的动作识别因为 ...

  8. wpf学习资料链接(做记录)

    1.wpf快速入门系列:https://www.cnblogs.com/zhili/tag/WPF/

  9. 面向对象高级A(反射,拦截方法)

    一等公民:只要可以把一个东西赋值给一个变量,这个东西就叫一等公民 断点调试 在想要加断点的地方用鼠标点击一下,会看到一个红色圆圈 变红的地方,程序执行到,就会暂停 断点应该加在报错之前,在错误代码上放 ...

  10. hadoop KerberosUtil 做Kerberos认证

    网上找了一下,自己写了个KerberosUtil工具类,测试过可以用. 注意这个不是 org.apache.hadoop.security.authentication.util.KerberosUt ...