一串数,求相邻的两个数的最大间距。如[1.3,3.1,2,5,5.4,6.1],最大间距是1.9,就是3.1、5的间距。时间复杂度要求O(N)。
简单的办法是排序,然后很容易就计算到了最大的间距,可是排序最快的时间复杂度是O(NlogN),不符合题目要求。
换一个思路,就是空间换时间,这里也没有对空间有要求。这里实现的算法就是多费了点内存,最后时间复杂度O(N),满足了要求。具体算法看以下代码。
简单的办法是排序,然后很容易就计算到了最大的间距,可是排序最快的时间复杂度是O(NlogN),不符合题目要求。
换一个思路,就是空间换时间,这里也没有对空间有要求。这里实现的算法就是多费了点内存,最后时间复杂度O(N),满足了要求。具体算法看以下代码。
package test;
import java.util.Arrays;
/**
* 一串数,求相邻的两个数的最大间距。如[1.3,3.1,2,5,5.4,6.1],最大间距是1.9
* @date 2014-4-14
* @encode UTF-8
* */
public class MaxGap {
/**
* 计算一组数x中相邻数的最大间距
* </br>
* 算法:首先找到最大、最小数,则x所有数在这两个数构成的区间内。
* 将这个区间均分成n份(n是个数),则x中任意一个数在某区间内。
* 一个小区间内可能不含x的数,也可能包含多个,只记录该区间内的最大数、最小数。
* 再遍历各区间,两个都有数的区间之间的最大间距,也就是要求的最大间距。
* @warn x的长度>=2
* @param x 若干数
* */
public double maxGap(double[]x){
double min,max,avrGap;
//y[2*j]是区间j最小数的下标,y[2*j+1]是最大数的下标
int[]y=new int[2*x.length];
Arrays.fill(y, -1);
min=max=x[0]