第14题:
题目:输入一个已经按升序排序过的数组和一个数字,
在数组中查找两个数,使得它们的和正好是输入的那个数字。
要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。
例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。
思路:从前后同时往中间扫,如果当前两个数的和大于sum,后面的数往前移,如果和小于sum,前面的数往后移。
#include<cstdio> #include<iostream> using namespace std; void findNum(int arr[],int length,int sum){ int left=0,right=length; while(left<right){ if(arr[left]+arr[right]==sum) { cout<<arr[left]<<" "<<arr[right]<<endl; return; } else if(arr[left]+arr[right]>sum) right--; else left++; } cout<<"cannot find"<<endl; } int main(){ int arr[]={1,2,4,7,11,15}; int length=sizeof(arr)/sizeof(arr[0])-1; findNum(arr,length,15); return 0; }