有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数。 下面是一个结发了,利用了stl 的sort 来晚成排序。
#include <iostream>
#include <vector>
#include <ctime>
#include <cstdio>
#include <cmath>
using namespace std;
#define N 100
#define M 200
int inline dis(int a, int b)
{
return abs(a-b);
}
void print(int & a)
{
cout <<" " << a << " ";
}
int main()
{
int i, min , tmp;
vector<int> vi;
srand(time(NULL));
for( i = 0 ; i < N ; i ++)
vi.push_back((tmp = rand() % M,tmp %2 == 0 ? -tmp : tmp));
sort(vi.begin(),vi.end(),less<int>());
//for_each(vi.begin(),vi.end(),print);
for(i=1 ; i < vi.size() ; i ++) ...{
tmp = dis(vi[i-1],vi[i]);
if(i == 1) ...{min = tmp; continue;} if(!tmp) ...{ min = 0 ; break;}
if(tmp < min ) min = tmp;
}
cout <<endl << "Minimal distance is : " << min << endl;
return 0;
}
#include <vector>
#include <ctime>
#include <cstdio>
#include <cmath>
using namespace std;
#define N 100
#define M 200
int inline dis(int a, int b)
{
return abs(a-b);
}
void print(int & a)
{
cout <<" " << a << " ";
}
int main()
{
int i, min , tmp;
vector<int> vi;
srand(time(NULL));
for( i = 0 ; i < N ; i ++)
vi.push_back((tmp = rand() % M,tmp %2 == 0 ? -tmp : tmp));
sort(vi.begin(),vi.end(),less<int>());
//for_each(vi.begin(),vi.end(),print);
for(i=1 ; i < vi.size() ; i ++) ...{
tmp = dis(vi[i-1],vi[i]);
if(i == 1) ...{min = tmp; continue;} if(!tmp) ...{ min = 0 ; break;}
if(tmp < min ) min = tmp;
}
cout <<endl << "Minimal distance is : " << min << endl;
return 0;
}
看过有这样的一种解法,找出数组中最大值和最小值,把所有的数map 到这个区间的bit 数组中。 那么两个相邻的bit 为 1 的两个bit 位置的差值最小的就是这个值。如果有相同的数值,那么会map 到一个bit 位上,那么最小的绝对值就是 0 了。
本文介绍了一种求解整数数组中两两元素差值绝对值最小值的方法。通过排序和遍历数组,实现高效查找。此外还讨论了一种使用bit数组映射的解决方案。
995

被折叠的 条评论
为什么被折叠?



