练习 2.3-7 求一个元素是否为数组中两个数的和
来源:互联网 发布:淘宝开店 商标 随便 编辑:程序博客网 时间:2024/05/17 00:51
题目:
给出一个O(nlgn)的算法,使之能在给定一个由n个整数构成的集合S和另一个整数x时,判断S中是否存在有两个其和等于x的元素。
思路:
首先采用合并排序算法对数组进行从小到大排序(复杂度为O(nlgn))
然后从左→右扫描数组S(时间复杂度为O(n)),对每个a[i],在数组中用二分查找算法寻找v-a[i](时间复杂度为O(lgn)),则总时间复杂度为O(nlgn)
#include <iostream>#include <vector>using namespace std;void merge(vector<int> &ivec,int p,int q,int r){int nl=q-p+1;int nr=r-q;int *L=new int[nl];int *R=new int[nr];for(int i=0;i<nl;i++)L[i]=ivec[p+i];for(int j=0;j<nr;j++)R[j]=ivec[q+1+j];int m=0,n=0;for(int k=p;k<=r;k++){if(m<nl && n<nr)ivec[k]=L[m]<R[n]?L[m++]:R[n++];else if(m<nl)ivec[k]=L[m++];elseivec[k]=R[n++];}delete []L;delete []R;}void mergeSort(vector<int> &ivec,int p,int r){if(p<r){int q=(p+r)/2;mergeSort(ivec,p,q);mergeSort(ivec,q+1,r);merge(ivec,p,q,r);}}int main(){cout<<"enter a list of numbers(ctrl+z to end):"<<endl;int val;vector<int> ivec;while(cin>>val)ivec.push_back(val);cout<<"enter a number that be the sum of two elements in the list:"<<endl;int sum;cin.clear();cin.sync();cin>>sum;//先合并排序,时间O(nlgn)mergeSort(ivec,0,ivec.size()-1);//再查找int flag=0;int i=0,j=ivec.size()-1;while(i<j){int k=ivec[i]+ivec[j];if(k==sum){flag=1;break;}else if(k<sum)i++;elsej--;}if(flag)cout<<"存在"<<ivec[i]<<"+"<<ivec[j]<<"="<<sum<<endl;elsecout<<"数组中不存在两个数的和等于"<<sum<<endl;return 0;}
- 练习 2.3-7 求一个元素是否为数组中两个数的和
- 求一个数组中的和为任意一个数的两个元素
- 求一个值是否是一个给定有序数组中两个元素的和
- 给一个数a,求一组数据中是否有两个数的和为a?
- 数组中是否有两个数的和为10...
- 数组中是否有两个数的和为10
- 求从一个整数数组中两个数之和为m的两个数
- 求数组中元素为另外两个元素和的最大元素
- 算法导论9.3-8-设X[1..n]和Y[1..n]为两个数组,每个都包含n个已排好序的数,给出一个求数组X和数组Y中所有2n个元素的中位数
- 1. Two Sum 给定一个数组和一个数,输出两个和为给定数的数组元素的下标
- 一个N个整数的无序数组,给你一个数sum,求出数组中是否存在两个数,使他们的和为sum
- 一个N个整数的无序数组,给你一个数sum,求出数组中是否存在两个数,使他们的和为sum
- 求数组中两个元素加起来等于指定的数
- 判断一个有序数组中是否有两个数的和等于给定的数
- 在一个数组中找两个数,使得它们的和为一个指定的数
- 求一个数组中两个元素的最大差值
- 给定一个整数数组,返回数组中两个元素的和为target的索引
- 「算法导论」:课后习题2.3-7求集合S中是否有两个元素的和为X
- Eclipse中10个最有用的快捷键组合
- Sqlplus登录命令
- 修改Extjs Grid和PagingBar的Store
- .net常用函数语法
- 线性表之双向链表
- 练习 2.3-7 求一个元素是否为数组中两个数的和
- 在 DB2 优化器中使用分布统计信息
- JAVA项目架构之我见
- Android 按键屏蔽, Back, Home....
- 我在学习编程中犯的两个最大错误
- 软件开发成本构成及评估
- 很赞的图标搜索网站
- js 给数组赋值
- 用来武装Firefox的24款Web开发插件