题目本身引自: http://blog.csdn.net/koudaidai/article/details/8066395
一个数列 顺序排好 给一个m 求|m - n1*n2 |最小的n1 n2 ,这两个数 是这个数列里的。
基本思路: 从头和尾各一个指针, 想中间移动. 比如头n1, 尾n2, n1*n2 > m, 可推断n1 后面的所有值与n2乘更大于m, 所以把n2 --
源码如下:
void GetMostClose(int array[], int a_len, int m)
{
int pre_i = 0, i = 0;
int pre_j = a_len -1, j = a_len - 1;
int max_base = (1<<31)-1;
std::cout << max_base << endl;
while (j > i)
{
int curr = array[i] * array[j];
int diff = (m - curr);
if (diff < 0) diff *= -1;
if (diff < max_base)
{
pre_i = i;
pre_j = j;
max_base = diff;
}
else if (curr <= m)
i++;
else
j--;
}
std::cout << "m=" << m << ",i=" << array[pre_i] << ",j=" << array[pre_j] << endl;
}
int main()
{
int a[12] = {1,2,3,4,5,6,7,8,9,10,11,12};
GetMostClose(a, sizeof(a)/sizeof(int), 49);
}
结果输出:
2147483647
m=49,i=4,j=12