您的位置:首页 > 其它

N个未排序的随机数,在线性时间内,求这N个数在数轴上相邻两个数的最大值

2015-09-17 17:55 127 查看
public class MaxSub
{
public static void main(String[] args)
{
int[] a ={5,7,3,1,6,2};
System.out.println(maxSub(a));

}

/**
* @用于找出N个随机数在数轴相邻位置的最大差值
*/
public static int maxSub(int[] a)
{
int min=a[0];//初始化数组的最小值min
int max=a[0];//初始化数组的最大值max
for (int i = 0; i < a.length; i++)//循环一次找出数轴最大最小值复杂度O(N)
{
if (a[i] < min)
min = a[i];
if (a[i] > max)
max = a[i];
}
int[] count = new int[max-min+1];//记录数轴上位置的数组,从min开始到max结束
for (int i = 0; i< max-min+1; i++)//初始化坐标轴数组  复杂度为O(max-min+1)和N线性关系
{
count[i] = 0;
}
for(int i = 0;i< a.length; i++)//标记数组a在数轴上位置  复杂度为O(N)
{
count[a[i]-min]++;
}
int maxSub = 0;//最大差值
int tempSub = 1;//数轴上相邻两个数的距离
for(int i = 0;i< max-min+1; i++)//根据坐标轴上标记位置找出相邻最大差值maxSub 复杂度为O(max-min+1)
{
if (count[i]==0)tempSub++;
else{
if(tempSub>maxSub)
{
maxSub = tempSub;
}
tempSub = 1;
}
}
return maxSub;
}
}


思路:
复杂度为N找出最大值最小值,然后建立一个长度为最大值减去最小值加1的数组作为坐标轴。
先初始化数组,数组每一项都为0,然后把原数组遍历, 对count[a[i]-min]++;相当于标记数组在坐标轴上位置,

最后找到相邻非零元素间最远距离即为最大差值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: