描述一个运行时间为Θ(nlgn)的算法,给定n个整数的集合S和另一个整数x,该算法能确定S中是否存在两个其和刚好为x的元素
2013-12-14 16:24
836 查看
算法思路:
首先对S[1...n]进行非降序排序,然后设置两个指向标i=1,j=n,执行下面的操作:
S[i] + S[j] = X, 返回true
< X, i = i+1
> X, j = j-1
如果 i>j 返回false
首先对S[1...n]进行非降序排序,然后设置两个指向标i=1,j=n,执行下面的操作:
S[i] + S[j] = X, 返回true
< X, i = i+1
> X, j = j-1
如果 i>j 返回false
#include <iostream> #include <ctime> #include <limits> using namespace std; void merge(int *a,int low,int mid,int high)//哨兵法 归并排序 { int Ln=mid-low+1; int Rn=high-mid; int *La=new int[Ln+1]; int *Ra=new int[Rn+1]; for(int i=0;i<Ln;++i){ La[i]=a[low+i]; } for(int j=0;j<Rn;++j){ Ra[j]=a[mid+j+1]; } La[Ln]=numeric_limits<int>::max(); Ra[Rn]=numeric_limits<int>::max(); int m=0,n=0; for(int k=low;k<=high;++k){ if(La[m]<=Ra ){ a[k]=La[m]; ++m; }else{ a[k]=Ra ; ++n; } } } void merge_sort(int * a,int low,int high)//O(n*lgn) { if(low<high){ int mid=(low+high)>>1; merge_sort(a,low,mid); merge_sort(a,mid+1,high); merge(a,low,mid,high); } } bool sum_to_x(int *a,int low,int high,int x)//求序列S中是否存在两个数之和为X,O(n) { int i=low,j=high; while (i<j){ if(x==(a[i]+a[j])){ return true; }else if(x<(a[i]+a[j])){ --j; }else{ ++i; } } return false; } int main() { srand(time(NULL)); int count; while ((count=rand()%20)<3); int *a=new int[count]; for(int i=0;i<count;++i){ a[i]=rand()%35; cout<<a[i]<<" "; } cout<<endl; merge_sort(a,0,count-1); for(int i=0;i<count;++i){ cout<<a[i]<<" "; } cout<<endl; int x=rand()%100; bool flag=sum_to_x(a,0,count-1,x); cout<<x<<" is in S ? "<<boolalpha<<flag<<endl; }
相关文章推荐
- 2.3-7 描述一个运行时间为Θ(nlgn)的算法,给定n个整数的集合S和另一个整数x,该算法能确定S中是否存在两个其和刚好为x的元素
- 描述一个运行时间为O(nlgn)的算法,使之能在给定一个由n个整数构成的集合S和另一个整数 X 时,判断出S中是否存在有两个其和刚好等于 X 的元素。
- 题目:请给出一个运行时间为Θ(nlgn)的算法,使之能在给定一个由n个整数构成的集合S和另一个整数x时,判断出S中是否存在有两个其和等于x的元素。
- 题目1.请给出一个运行时间为O(nlgn)的算法,使之能在给定一个由n个整数构成的集合S和另一个证书x时,判断出S中是否存在有两个其和等于x的元素。
- 给定N个整数集合是否存在两个其和刚好为指定常数的元素
- 【算法导论学习-005】整数集合S中是否存在两个数等于给定的一个整数
- 给定N个整数集合是否存在两个其和刚好为指定常数的元素
- 题目2.给出一个算法,它能用O(nlgn)的最坏情况运行时间,确定n个元素的任何排列中逆序对的数目
- 给定一个集合和一个正整数c,判定是否存在该集合的子集,使其所有元素的和等于给定的正整数c?
- 确定集合中是否存在两个其和刚好为X的元素?
- 给定有向图,设计一个算法,找出两个结点之间是否存在一条路径
- 采用邻接表存储结构,编写一个判别无向图中任意给定的两个顶点之间是否存在一条长度为k的简单路径的算法。
- 集合S中是否存在两个元素使它们的和等于另外一个整数
- 给出一个实数集合和一个实数,怎样判断集合中是否存在两个和等于该实数的元素
- 判断序列中是否存在两个元素之和为x,时间复杂度O(nlgn),算法导论练习2.3,linux纯C实现
- 一个运行时间为nlgn的算法,能判断在集合S中是否有两数之和为x
- 在一个长度为n(n < 1000)的整数序列中,判断是否存在某两个元素之和为k。
- 给定一个未排序的整数数组,找到第一个缺失的正整数 您的算法应在O(n)时间运行,并使用恒定空间。
- 程序员面试金典: 9.4树与图 4.2给定有向图,设计一个算法,找出两个节点之间是否存在一条路径。
- 小算法:给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串s首先