题目:已知一个升序的数组array,再给定一个定值sum,现在要找出数组array中哪两个元素的和最接近于这个定值sum,并输出这两个元素。
思路:因为已知的数组是升序序列,先将数组中大于sum值的元素全部干掉,记下小于sum最接近于sum的元素的下标n。设定两个哨兵head=0,rear=n,由于是升序序列,如果array[head]+array[rear]>sum,将rear向前移动一位,反之将head向后移动一位。直至当前一组判断值小于sum,后面一组判断值大于sum,那么当前这一组判断值得两个元素就是要寻找的两个元素。
#include <iostream>
using namespace std;
#define MAX 10
int Array[MAX];
int sum;
int goalnum1, goalnum2;
void FindNumber(int head, int rear)
{
while(rear -head != 1)
{
if(Array[head] +Array[rear] > sum)
rear--;
else if(Array[head] +Array[rear] == sum)
{
goalnum1 = head;
goalnum2 = rear;
return;
}
else if(Array[head] +Array[rear] < sum)
{
head++;
if(Array[head] +Array[rear] > sum)
{
goalnum1 = head -1;
goalnum2 = rear;
return;
}
}
}
goalnum1 = head;
goalnum2 = rear;
return;
}
int main()
{
int elem, length, temp = 0;
cin >> length;
while(temp <length)
{
cin >> elem;
Array[temp++] = elem;
}
int operate;
cin >> operate;
sum = operate;
int i;
for(i =0; i <MAX && Array[i] <sum; i++)
{
}
FindNumber(0, i-1);
cout << Array[goalnum1] << " " << Array[goalnum2]
<< endl;
return 0;
}