求出数组两两之差绝对值最小的值
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);
相关文章推荐
- 求数组两两之差绝对值最小的值
- 求数组两两之差绝对值最小的值[转 ]
- 有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数。
- 微软面试-101-有一个整数数组,请求出两两之差绝对值最小的值,
- 求数组两两之差绝对值最小的值
- 有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数
- 求数组两两之差绝对值最小的值
- 【转】[面试题] 求数组两两之差绝对值最小的值
- 整数数组中两两之差绝对值最小的值
- 有一个整数数组,请求出两两之差绝对值最小的值
- 微软面试题,求数组中两两之差绝对值最小的值。O(n)
- 有一个整数数组,请求出两两之差绝对值最小的值, 记住,只要得出最小值即可,不需要求出是哪两个数。
- 有一个整数数组,请求出两两之差绝对值的最小值
- 求最小绝对值子串、一个整数数组求两两之差绝对值最小值
- 输入一个整数数组,返回所有元素两两之差绝对值最小的值,O(n)算法
- 整数数组中两两之差绝对值最小的值
- 有一个整数数组,请求出两两之差绝对值最小的值
- 有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数。 (微软面试题)
- 终于搞清楚了C#二进制的一些关键操作了,解决了微软面试题,求数组中两两之差绝对值最小的值O(N)最少内存限制的问题!
- 有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数。