首页 > 试题广场 >

N个未排序的整数,在线性时间内,求这N个整数在数轴上相邻两个

[问答题]
N个未排序的整数,在线性时间内,求这N个整数在数轴上相邻两个数之间的最大差值(请写出关键算法)
使用改进的桶排序即可,详见
http://ask.julyedu.com/question/751
发表于 2015-09-28 18:29:26 回复(0)

要求在线性时间内完成,可以使用桶排序(计数排序/基数排序)解决。

排序前: [-5, -3, -5, -3, 9, -6, 3, 1, -3, -8]
排序后: [-8, -6, -5, -5, -3, -3, -3, 1, 3, 9]

计算相邻两数之间的差值,得出最大值。


排序前: [-5, -3, -5, -3, 9, -6, 3, 1, -3, -8]
排序后: [-8, -6, -5, -5, -3, -3, -3, 1, 3, 9]
最大值: 6
编辑于 2015-09-29 16:33:15 回复(2)
2.png



3.png

4.png

发表于 2015-10-26 09:21:01 回复(0)
我直接用超大的辅助数组来做,实在没办法
发表于 2015-09-28 16:37:49 回复(0)
public class Main {
	public static void main(String[] args) {
		
	}
	
	public int maxDValue(int[] arr) {
		if (arr.length < 2) {
			return -1;
		}
		
		int result = Math.abs(arr[0] - arr[1]);
		for (int i = 1; i < arr.length - 1; i++) {
			if (Math.abs(arr[i] - arr[i + 1]) > result) {
				result = Math.abs(arr[i] - arr[i + 1]);
			}
		}
		
		return result;
	}
}
发表于 2017-03-21 15:45:30 回复(0)
桶排序typedef struct tagBucket
{
bool bValid;
	int nMin;
	int nMax;
tagBucket():bValid(false){}
void Add(int n)
{
if(!bValid)
{
nMin = nMax = n;
bValid = true;
}
else
{
if(nMax<n)nMax = n;
else if(nMin>n)nMin = n;
}
}
}SBucket;
int GetMaxGap(const int* A,int size)
{
SBucket* pBucket = new SBucket[size];
int nMax = A[0];
int nMin = A[0];
int i = 0;
for(i=0;i<size;i++)
{
if(nMax<A[i])nMax = A[i];
else if(nMin>A[i])nMin = A[i];
}
int delta = nMax-nMin;
int nBucket;
for(i=0;i<size;i++)
{
nBucket = (A[i]-nMin)*size/delta;
if(nBucket>=size)
{
nBucket = size-1;
}
pBucket[nBucket].Add(A[i]);
}
i = 0;
int nGap = delta/size;
int gap;
for(int j=1;j<size;j++)
{
if(pBucket[j].bValid)
{
gap = pBucket[j].nMin-pBucket[i].nMax;
if(nGap<gap)nGap = gap;
i = j;
}
}
return nGap;
}


发表于 2015-11-25 22:17:04 回复(1)
function getMaxDistance(arr,count){
	var len = arr.length,max,min;
	if(len==0) return [];
	count = count||(count>1 ? count:10);
	//判断最大最小值
	min = max = arr[0];
	for(var i=1;i<len;i++){
		min = min < arr[i] ? min :arr[i];
		max = max > arr[i] ? max :arr[i];
	}
	//桶间距
    var delta = (max-min+1)/count;
    //初始化桶
    var buckets = [];
    for(i=0;i<count;i++){
    	buckets[i] =[];
    	buckets[i].bValid=false;
    	buckets[i].nMax;
    	buckets[i].nMin;
    	buckets[i].Add = function(n){
    		if(!this.bValid){
    			this.nMin = this.nMax = n;
    			this.bValid = true;
    		}else{
    			if(this.nMax<n){
    				this.nMax = n;
    			}else if(this.nMin>n){
    				this.nMin = n;
    			}
    		}
    	}
    }

    var idx,idxlen;
    for(i = 0;i<len;i++){
    	//获得桶索引
    	idx = Math.floor((arr[i]-min)/delta);
    	//idxlen =buckets[idx].length;
    	//非空桶
    	buckets[idx].push(arr[i]);
    	buckets[idx].Add(arr[i]);
    }
    i=0;
    var ngap = delta;
    for(var j=1;j<count;j++){
    	if(buckets[j].bValid){
    		gap =buckets[j].nMin-buckets[i].nMax;
    		if(ngap <gap)
    			ngap = gap;
    		i=j;
    	}
    }
    return ngap;
}
var arr1 = [6,7,0,3,2,9,1,17,8,3,6,5,0,1,10];
var arr2 = [-5, -3, -5, -3, 9, -6, 3, 1, -3, -8];
console.log(getMaxDistance(arr1,arr1.length));//7
console.log(getMaxDistance(arr2,arr1.length));//6

发表于 2015-10-09 10:04:37 回复(0)
file:///D:/Documents/Tencent%20Files/3181277018/FileRecv/2015-07-08%E9%A2%98%E7%9B%AE%E8%A7%A3%E9%87%8A%E5%8F%8A%E5%85%B6%E4%BB%A3%E7%A0%81-4%20(1).pdf
牛客网里的精品课程有一期讲过,这个是pdf,可以看一下
发表于 2015-10-04 21:18:45 回复(3)
public class Main {
	public static void main(String[] args) {
		int [] a={1,11,16};
		maxBetween(a);
	}
	public static void maxBetween(int arr [])
	{
		int length=arr.length;
		int lengthInteger=0;
		String [] strs=new String [length];
		for (int i=0;i<length;i++)
		{
			strs[i]=Integer.toString(arr[i]);
			if(strs[i].length()>lengthInteger)
			{lengthInteger=strs[i].length();}
		}
		String [][] strss=new String [lengthInteger][length];
		int len=0;
		int k=0;
		for (int i=0;i<length;i++)
		{
			len=strs[i].length();
			for(int j=1;j<lengthInteger+1;j++)
			{
				if(j==len)
				{
					while(strss[j-1][k]!=null)
					{	k++;}
					strss[j-1][k]=strs[i];
				}
				k=0;
			}
		}
		String  strTemp=null;
		for (int i=0;i<lengthInteger;i++)
			for(int j=0;j<length-1;j++)
			{
				if(strss[i][j+1]!=null)
				{
					for(int s=0;s<i+1;s++)
					{
						if(strss[i][j].charAt(i-s)>
						strss[i][j+1].charAt(i-s))
						{
							strTemp=strss[i][j];
							strss[i][j]=strss[i][j+1];
							strss[i][j+1]=strTemp;
						}
					}
				}
			}
		k=0;
		for (int i=0;i<lengthInteger;i++)
			for(int j=0;j<length;j++)
			{
				if(strss[i][j]!=null)
				{
					arr[k]=Integer.parseInt(strss[i][j]);
					k++;
				}
			}
		int maxBetween=0;
		for(int i=0;i<length-1;i++)
		{
			if(maxBetween<Math.abs(arr[i]-arr[i+1]))
			{
				maxBetween=Math.abs(arr[i]-arr[i+1]);
			}
		}
		System.out.println(maxBetween);
        strs=null;
        strss=null;
        strTemp=null;
	}

}


发表于 2015-09-29 19:25:37 回复(0)
直接遍历不行吗??

int max = 0; 
for(int i=1; i<n; i++) 
    int m = a[i] - a[i-1];
   m = m>0?m:(-m); 
  if(m>max) 
    max = m; 
}

return max;
发表于 2015-09-29 08:21:12 回复(4)
有种排序法 称为桶排序  时间为0(n)

可以用
发表于 2015-09-28 16:38:25 回复(2)
不知是不是我的理解有误,根据题意,有两种理解:1、原始整数序列的操作;2、原始序列排序后的操作。其实没有太大的区别,只是第二种方法需要先排下序。

- (void)viewDidLoad {

    [ super viewDidLoad];

    

    dataArr = [ NSMutableArray arrayWithArray :@[@4,@(-25),@3,@6,@78,@10,@18]];

    sourceArr = [NSMutableArray array ]; // 存放差值

    

    //第一种情况直接获取N个未排序整数相邻两个数之间的差值比较

    [self getMaxV];

    

    //第二种情况获取排过序的整数相邻两个数之间的差值比较

    //排序完成之后在调用getMaxV方法

}

- (void)getMaxV{

    NSLog (@"数据源-->\n%@", dataArr );

    

    for (int i = 0;  i < dataArr.count-1; i++) {

        int value = 0;

        value = [dataArr[i+1] intValue] - [dataArr[i] intValue];

        value = value > 0 ? value : (-value);

        [sourceArr addObject:[NSString stringWithFormat:@"%ld",(long)value]];

    }

    NSLog (@"两两之间差值%@", sourceArr );

    

    int index = 0;

    int max = 0;

    for (int i = 0; i < sourceArr.count-1; i++) {

        int firstV = [sourceArr[i] intValue];

        int secondV = [sourceArr[i+1] intValue];

        if (firstV >= secondV) {

            if (max < firstV) {

                index = i;

                max = [sourceArr[i] intValue];

            }

        }else{

            if (max < secondV) {

                index = i+1;

                max = [sourceArr[i+1] intValue];

            }

        }

    }

    

    NSLog(@" %ld 个与第 %ld 个之间的差值最大为 %ld",(long)index+1,(long)index+2,(long)max);


}


发表于 2015-09-28 15:47:29 回复(0)
Integer res = Integer.MIN_VALUE;
int[] arr = {1,3,9,1,7,3,6};
for(int i = 0;i < arr.length - 1; i++){
    res = Math.max(res, Math.abs(arr[i] - arr[i+1]));
}
System.out.println(res);
发表于 2015-09-28 10:53:00 回复(2)