从有序数组中找出和为某值的两个数(笔试题)

这是今天去做紫光展锐的笔试时遇到的一个编程题,已知一个数组中的元素是升序排序的,其中有两个数的和为200(测试的时候改成了50),要求以最快的方式找出这两个数,当时就想到了借鉴快速排序算法中的思路,但是没写完整,有点遗憾,这是自己下来补充后的代码,测试后可以达到效果,但这种算法不一定是最快的,共勉。

/*dataArray为有序数组,其中只有两个数的和为sum,以最快的方法找出这两个数*/
int sum=50;
void FindNumber(int *dataArray, int size, int *number1, int  *number2)
{
     int low=0, high=size-1;
     int temp=dataArray[low]+dataArray[high];
     while (low<high && temp!=sum)
     {
           while (low<high && temp<sum)
           {
                low++;
                temp=dataArray[low]+dataArray[high];
           }
           while (low<high && temp>sum)
           {
                high--;
                temp=dataArray[low]+dataArray[high];
           }
     }
     if(temp==sum)
     {
          *number1=dataArray[low];
          *number2=dataArray[high];
     }
     else
     {
          *number1=0;
          *number2=0;
     }
}

void TestFindNumber()
{
	int data[10]={1, 3, 6, 8, 10, 11, 12, 35, 40, 43};
	int number1, number2;//用于存储找到的两个数
	FindNumber(data, 10, &number1, &number2);
	printf("number1: %d\t number2: %d\n", number1, number2);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值