数组中寻找和为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;}
- 数组中寻找和为sum的两个元素
- Two sum 在数组中寻找和为指定值的两个数
- 第十四题(升序数组中寻找和为特定数的两个元素)
- 求数组中元素为另外两个元素和的最大元素
- 1. Two Sum 给定一个数组和一个数,输出两个和为给定数的数组元素的下标
- 寻找数组中两个数的和为M的组合
- 在数组中寻找和为指定值的两个数
- 寻找数组中满足和为定值的两个数或所有可能组合
- 常见面试算法题:给定数组中寻找加和为特定数的两个数
- 数组------寻找和为定值的两个数
- 在给定的数组中找出两个元素和为给定值的所有元素对
- 在给定的数组中找出两个元素和为给定值的所有元素对
- Two Sum(找出数组中两个和等于指定数字的元素)
- 167. Two Sum II - Input array is sorted (在有序数组中确定和为给定值的两个元素的下标)
- 给定一个整数数组,返回数组中两个元素的和为target的索引
- LeetCode 1. Two Sum--数组中两元素相加为该数值,输出对应的两个索引
- 在一个排好序的数组中查找和为sum的两个数
- 在给定数组中查找两个数的和为给定值sum
- joomla k2学习及布局修改(一)
- 实现android动画效果学习二
- 云——没那么强!
- S3C6410启动模式介绍
- OpenGL 入门
- 数组中寻找和为sum的两个元素
- AndroidManifest.xml文件详解
- 什么是ini?
- grep usage
- ARM地址重映射的通俗解释
- STM32 (Cortex-M3) 中NVIC(嵌套向量中断控制)的理解 .
- 黑盒测试用例设计模式-边界值分析(上)
- linux下dup2的实现
- 浅谈android suid无效问题