找出数组中的两个数字,相加等于一个给定的数字。
(1)递归,从第一个元素和最后一个元素相加,如果大于sum,则a b-1,继续判断两个数的和;
如果小于sum,则 a+1 b元素,继续判断两个数的和#include <iostream>
using namespace std;
void find(int data[],int a, int b, int s)
{
if(a<b)
{
if(data[a]+data[b]==s)
cout<<data[a]<<"\t"<<data[b]<<endl;
else if(data[a]+data[b]>s)
find(data,a,b-1,s);
else
find(data,a+1,b,s);
}
else
cout<<"can not find ";
}
void main()
{
int sum = 15;
int data[]={1,2,4,7,11,15};
int length=sizeof(data)/sizeof(int);
find(data,0,length-1,sum);
}
(2)
设置头尾两个指针,从第一个元素和最后一个元素相加,如果大于sum,则尾指针向前移1个元素,继续判断两个数的和;
如果小于sum,则头指针向后移1个元素,继续判断两个数的和
#include <iostream>
using namespace std;
void find(int *array, int length, int s)
{
int *a=&array[0];
int *b=&array[length-1];
while(a<b)
{
if(*a+*b==s)
{
cout<<*a<<"\t"<<*b<<endl;
return;
}
else if(*a+*b>s)
b--;
else
a++; }
cout<<"can not find ";
}
void main()
{
int sum = 15;
int data[]={1,2,4,7,11,15};
int length=sizeof(data)/sizeof(int);
find(data,length,sum);
}
(3)hash表
#include <iostream>
using namespace std;
void printSum(int a[],int n,int total)
{
int b[100]={0};
for(int i=0;i<n;i++)
b[a[i]]++;
for(int j=0;j<n;j++)
{
int m=total-a[j];
if(b[m]==1) //m= 1,2,4时
{
printf("%d+%d=%d\n",a[j],m,total);
break;
}
}
}
void main()
{
int sum = 15;
int data[]={1,2,4,7,11,15};
int length=sizeof(data)/sizeof(int);
printSum(data,length,sum);
}