找出和为某个常数的数对
来源:互联网 发布:文明5黄金时代算法 编辑:程序博客网 时间:2024/05/22 01:17
1. 问题描述
已知大小分别为m,n的两个无序数组A,B和一个数常数c, 求满足A[i] + B[j] = c的所有A[i]和B[j]。
【方案一】
<枚举法> 这是最简单的方法,枚举A和B中所有元素对,看其和是否为c,如果是,则输出。
【方案二】
<排序+二分查找> 首先,对两个数组中较大数组(不妨设为A)排序;然后,对于B中每个元素B[i],
已知大小分别为m,n的两个无序数组A,B和一个数常数c, 求满足A[i] + B[j] = c的所有A[i]和B[j]。
【方案一】
<枚举法> 这是最简单的方法,枚举A和B中所有元素对,看其和是否为c,如果是,则输出。
【方案二】
<排序+二分查找> 首先,对两个数组中较大数组(不妨设为A)排序;然后,对于B中每个元素B[i],
在A中二分查找c-B[i],如果找到,直接输出。 时间复杂度为:O(mlogm+nlogm)。
/*【方案三】<排序+线性扫描>该方法是方案二的进一步加强,需要对两个数组排序。首先,对A和B进行排序;然后用指针p从头扫描A,用指针q从尾扫描B,如果A[p] + B[q] == c,则输出A[p]和B[q],且p++,q--;如果A[p]+B[q]>c,则q--;否则p++。时间复杂度为:O(mlogm+nlogn)。*/void sum_pairs(int *a, int n, int *b, int m, int sum){//O(mlogm + nlogn) sort(a, a + n); sort(b, b + m); int p = 0, q = m - 1; while(p < n && q >= 0) { if(a[p] + b[q] == sum) { cout << "a[p] = " << a[p] << " b[q] = " << b[q] << endl; p ++; q --; } else if(a[p] + b[q] > sum) q --; else p ++; }}
/*【方案四】<HashTable法>首先,将两个数组中较小数组(不妨设为A)保存到HashTable中,然后,对于B中每个元素B[i],也采用相同hash算法在HashTable中查找c-B[i]是否存在,如果存在,则输出。时间复杂度为:O(m+n),空间复杂度为:O(min{m,n})。*/void sum_pairs2(int *a, int n, int *b, int m, int sum){//O(m + n) 空间:O(min(n, m)) int *pSma = a, *pBig = b; int nSma = n, nBig = m; if(n < m) { pSma = b; pBig = a; nSma = m; nBig = n; } set <int> hash_table; hash_table.insert(pSma, pSma + nSma); for(int i = 0; i < nBig; i ++) { if(hash_table.find(sum - pBig[i]) != hash_table.end()) cout << sum - pBig[i] << " " << pBig[i] << endl; }}
- 找出和为某个常数的数对
- 给定一个整形数组,是否能找出其中的两个数使其和为某个指定的值?
- 找出全部积为16!的数对
- 算法题29 从一个取值范围为1~N的不重复数列中找出所有满足两数和为N+1的数对
- 算法题29 从一个取值范围为1~N的不重复数列中找出所有满足两数和为N+1的数对
- 从一个取值范围为1~N的不重复数列中找出所有满足两数和为N+1的数对
- 找出两个数组中满足给定和的数对
- 剑指offer38--数字的和为某个数
- 【练习】在二叉树中找出和为某个值的一条路径
- 算法---从一个数组(或者集合中)找出和为某个值的下标
- 找出满足条件数对的个数
- 面试算法题:从指定数组找出两数的和为指定的数
- 趣题:均匀分布且和为常数的n个变量
- n从1开始,可以对n加1,或者加倍,要使n为某个数的最少步数
- 两数之和二 给定一个整形的数组,找出其中的两个数使其和为某个指定的值,并返回这两个数的下标(数组下标是从0开始)。假设数组元素的值各不相同,则要求时间复杂度O(n),n为数组的长度
- 道听途说的技术面:找出正整数序列中连续几个数和为Num的区间
- 找出1到19之中数的和为20的所有组合
- 一个数组中两个数的和为N,找出这两个数字的下标
- Winsdows 8 环境下搭建Windows Phone 开发环境
- Android 模拟器 安装apk 注意事项
- Android异步下载网络图片(其一)
- JAVA学习—IO—转换流
- 切记 cocos2d中一个CCAction 对象只能被使用到一个Sprite对象上
- 找出和为某个常数的数对
- mini2440移植WIFI
- 【排故障】笔记本电脑屏幕与投影仪之间不可同时显示问题
- firebird学习笔记
- 浅谈java中dao工厂设计模式
- <WP7>(三)手把手教你写天气预报程序:运用WebClient获取天气和json数据解析
- gem install eventmachine fail
- ClassWizard里面找不到WM_ACTIVATE消息解决
- 1721. Gray code