在排序数组中查找和为给定值的两个数字

题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。

感觉这种利用两个指针的使用可以大大提高效率。学到挺多的.........

//在排序数组中查找和为给定值的两个数字
//从数组的两端开始扫,若两数之和小于目标,则头往后进一位,否则尾往前进一位
#include<iostream>
using namespace std;
bool find(int data[],int length,int num,int &ans1,int &ans2){ //o(n)的时间复杂度
	int head=0;
	int tail=length-1;
	while(head!=tail){
		int tempsum=data[head]+data[tail];
		if(tempsum==num) {ans1=data[head];ans2=data[tail];return true;}      //三种情况
		if(tempsum<num) head++;
		else tail--;
	}
	return false;
}
int main(void){
	int data[]={1,2,4,7,11,15};
	int a1=0,a2=0;
	if(find(data,6,15,a1,a2)){
		cout<<a1<<" "<<a2<<endl;
	}
	else cout<<"no answer"<<endl;
	system("pause");
	return 0;
}

原文地址:https://www.cnblogs.com/aLittleBitCool/p/1950127.html