从数组中找出其和等于S的两个数
来源:互联网 发布:windows备份恢复 编辑:程序博客网 时间:2024/06/05 08:16
在一个正数数组A[]中,看是否存在两个数,要求这两个数之和等于某个指定的数S。
当然,解法有很多种。
我就把我想到的,以及别人提供的一些思路总结一下。反正大概都是头脑风暴了。
1. 最朴实的做法
两重for循环。就算只算一个矩阵的下三角,那也是O(n^2)的量级。
2. 排序以后再找
因为是数组中全是正数,把S分解成两个整数相加,最大也就是S-1了。所以,如果能将数组A[]是个有序数组,就能很快将搜索范围缩小。于是我想了以下办法。
(1) 基数排序。O(dn)。d是关键字的位数。.e.g. 127的位数是3。
(2) 排序以后,二分查找到S的位置M。搜索范围降到了A[0] - A[M-1]。log2(n)。
(3) 再用第1种方法,O(M^2)。
3. 借助set
如果不排序,从左往右扫描A[],用set。
(1) i=0。遇到第一个数A[i],就把S-A[i]放入set。i++。
(2) 遇到第二个数A[i],就去看set中是否有A[i]。若有,就结束;若没有,就把S-A[i]继续放入set。i继续++。
(3) 重复上述过程。
据说STL的set是用红黑树实现的,查找、插入、删除等操作的时间复杂度为O(log2n)。
那么,这样做的复杂度,会是多少呢?
4. 那hashmap呢?
据说STL的map也是用红黑树实现的。hashmap是用哈希表实现的。
那么C++的hashmap怎么写?各种操作的复杂度大概是多少呢?
map和hashmap的区别呢?如果有碰撞,冲突怎么解决呢?所需时间呢?
5. 找到S的位置,把小于S的都放在S的左边
这个做法就类似于“如何从N个乱序数据中,快速地找出第K小的数?”了。
Review:快速找出第K小的数
先累计比S小的一共有多少个数,假设是M个,然后通过快排的找法,很快就能把范围缩小至M个了。
- 从数组中找出其和等于S的两个数
- 1.无序数组中找出两个数使其和等于给定值
- 从一个数组中找出几个数,使其相加等于某个值的算法(数组元素可以重复)
- 从数组中找出两个元素的和等于指定数值,并输出位置。
- 给出一个数和一个有序数组,找出该数组中之和等于该数的两个数
- 一个有序数组中找出两个数,使得两个数的和等于X的C++实现源代码
- 算法讨论(七)--已排序数组中寻找两个数,其和等于给定的数
- 找出有序数组中和等于指定数的两个数
- 在排序数组中寻找两个数使其和等于给定数
- 【100题】第十四题(数组中找两个数使其和等于输入数)
- 【算法题】数组中找到两个数,使其和等于某个数
- 数组中找两个数使其和等于输入数
- 从数组中找出最大的前两个数
- 从数组中找出所有组合为s的数
- 在数组中找出两个数a、b,使得a加b等于给定的c
- [Leetcode #1]Two Sum 从数组中找出和为特定值的两个数
- 找出数组中满足其左边的数都小于等于它,右边的数都大于等于它的数
- 在一个数组中,找出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它
- MarkDown/reST 文档发布流水线
- vue 2.0学习心得
- iOS-最全的App上架教程
- MyBatis(2):config.xml文件
- iOS 设置URL Scheme
- 从数组中找出其和等于S的两个数
- Mac SVN访问Windows服务器出错
- Tomcat学习2.2(简单的Servlet容器)
- 提高myEclipse的开发效率,设置
- 压缩感知科普
- echart展示图表
- Leetcode 299. Bulls and Cows
- windows10安装Scipy
- 中国压缩传感资源(China Compressive Sensing Resources)