解法一:
数组中总共包含N个数,把它们的两两差值求出来,就可以得到最小值对。时间复杂度为O(N2).N2值N的平方
代码如下:
double MinDifference(double arr[], int n)
{
if (n < 2)
return 0;
double fMinDiff = fabs(arr[0] - arr[1]);
for (int i = 0; i < n; ++i)
for (int j = i + 1; j < n;++j)
{
double tmp = fabs(arr[i] - arr[j]);
if (fMinDiff > tmp)
fMinDiff = tmp;
}
return fMinDiff;
}
解法二:
如果数组有序,可用O(N*log2N)的算法进行排序(快速排序,堆排序,归并排序)。排序完成后,求最小差值只需要O(N)的时间,总时间为O(N*log2N)。
伪代码如下:
double MinDifference(double arr[], int n)
{
if (n < 2)
return 0;
//sort array arr[]
Sort(arr, arr + n);
double fMinDiff = arr[1] - arr[0];
for (int i = 2; i < n; ++i)
{
double tmp = arr[i] - arr[i - 1];
if (fMinDiff > tmp)
fMinDiff = tmp;
}
return fMinDiff;
}
也可以使用分治的思想。用中间值k将数组分成左右两部分,小于K的位left部分,大于k的为right部分,那么这个最小值要么来自left部分,要么来自right部分。要么来自于left的最大值和right的最小值的差值。总时间为O(N*log2N)。
解法三:
二维的情况:
寻找最近点对
原文:http://blog.csdn.net/wangfengfan1/article/details/45200993