数组中寻找和为sum的两个元素

来源:互联网 发布:白敬亭 贝尔冒险 知乎 编辑:程序博客网 时间:2024/05/02 02:48

给定一个无序数列,和一个整数sum,求数组中的两个数a和b,使得a+b=sum。

解法:先升序排序O(n logn),再用两个游标ind1,ind2从两边开始向中间靠拢,

如果an[ind1]+an[ind2]>sum,则ind2--,否则ind1++,知道找到sum为止。最后,如果ind1==ind2,说明没找到,返回-1。

时间复杂度O(nlogn),空间复杂度O(1)

#include <iostream>#include <assert.h>#include <algorithm>#include <stack>#include <vector>#include <assert.h>using namespace std;int findSumNum(int *an, int n, int sum, int &ind1, int &ind2){assert(NULL !=an && n>0);sort(an,an+n);int p1=0, p2=n-1;int tsum;while (p1<p2){tsum = an[p1]+an[p2];if (tsum<sum){p1++;}else if (tsum>sum){p2--;}else{ind1=p1;ind2=p2;return 0;}}return -1; // 找不到}int main(){int an[]={1,2,3,4,5,6,7,8,9,0};int sum=15;int ind1,ind2;//15if (findSumNum(an,10,sum,ind1,ind2)==0){cout<<sum<<" = "<<an[ind1]<<" + "<<an[ind2]<<endl;}else{cout<<sum<<"  NOT FOUND"<<endl;}//sum=8;if (findSumNum(an,10,sum,ind1,ind2)==0){cout<<sum<<" = "<<an[ind1]<<" + "<<an[ind2]<<endl;}else{cout<<sum<<"  NOT FOUND"<<endl;}//sum=28;if (findSumNum(an,10,sum,ind1,ind2)==0){cout<<sum<<" = "<<an[ind1]<<" + "<<an[ind2]<<endl;}else{cout<<sum<<"  NOT FOUND"<<endl;}return 0;}

 

0-9的数列,查询15,8,28,结果:

 

 

下面是时间复杂度和空间复杂度都是O(n)的方法。

先将数组an中的元素加入hash_set,再依次查找sum-an[i]是否在hash_set中,如果有,记录其序号i,赋值给ind2,再遍历一遍an,找到与值为sum-an[ind2]的值即可

#include <iostream>#include <assert.h>#include <algorithm>#include <hash_set>#include <vector>#include <assert.h>using namespace std;using namespace stdext;int findSumNum(int *an, int n, int sum, int &ind1, int &ind2){assert(NULL !=an && n>0);int i;hash_set<int>hs;for (i=0; i<n; i++){hs.insert(an[i]);}ind2=-1;for (i=0; i<n; i++){if (hs.count(sum-an[i])){ind2=i;break;}}if (ind2>=0){int t=sum-an[ind2];for (i=0;i<n;i++){if (an[i] == t){ind1=i;return 0;}}}return -1; // 找不到}int main(){int an[]={1,2,3,4,5,6,7,8,9,0};int sum=15;int ind1,ind2;//15if (findSumNum(an,10,sum,ind1,ind2)==0){cout<<sum<<" = "<<an[ind1]<<" + "<<an[ind2]<<endl;}else{cout<<sum<<"  NOT FOUND"<<endl;}//sum=8;if (findSumNum(an,10,sum,ind1,ind2)==0){cout<<sum<<" = "<<an[ind1]<<" + "<<an[ind2]<<endl;}else{cout<<sum<<"  NOT FOUND"<<endl;}//sum=28;if (findSumNum(an,10,sum,ind1,ind2)==0){cout<<sum<<" = "<<an[ind1]<<" + "<<an[ind2]<<endl;}else{cout<<sum<<"  NOT FOUND"<<endl;}return 0;}


原创粉丝点击