您的位置:首页 > 其它

求出数组两两之差绝对值最小的值

2013-07-15 21:21 162 查看

题目描述

有一个整数数组,请求出两两之差绝对值最小的值,,记住,只要得出最小值即可,不需要求出是哪两个数。

思路1: 穷举

         此时复杂度为O(n^2)

思路2:

设这个整数数组是a1,a2,...,an

构造数组B=(b1,b2,...,bn-1)

b1 = a1-a2,

b2 = a2-a3,

b3 = a3-a4,

...

bn-1 = an-1 - an

那么原数组中,任意两整数之差ai-aj(1<=i,j<=n)可以表示成数组b中第i个到第j-1个元素的连续求和

接下去相当于是数组b中,子数组和的绝对值的最小值

即求 | b[i]+b[i+1]+b[i+2]+...+b[j] |的最小值,这种转换的思想挺好,但是在算法实现上只想到了O(n^2)的算法

int MinAbs( int array[], int len )
{
int *b = new int[len-1];
for ( int i=0; i<len-1; i++ ) {
b[i] = array[i+1] - array[i];
if ( b[i] == 0)
return 0;
}
// 接下去就差的最大值
/*
| b[i]+b[i+1]+b[i+2]+...+b[j] |最小值
*/
// 这求这个有没有什么好的算法呢???
int mindiff = 0x7fffffff;
for ( int i=0; i<len-1; ++i ) {
int diff = b[i];
int absdiff = abs(diff);
for ( int j=i+1; j<len-1; ++j ) {
diff += b[j];
if ( abs(diff) < absdiff )
absdiff = abs(diff);
}
if ( absdiff < mindiff )
mindiff = absdiff;
}
delete[] b;

return mindiff;
}

思路3:
    考虑先对数组进行排序,则此时再计算相邻两个数之间的插值,此时可得到最小值,此时算法的复杂度由排序算法的复杂度决定,快排的复杂度为O(nlgn)

sort( a, a+len );
int mindiff = 0x7fffffff;
for ( int i=0; i<len-1; ++i ) {
int diff = abs( a[i]-a[i+1] );
mindiff = min( diff, mindiff );
}
printf("min : %d\n", mindiff);  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐