从数组中找出一对元素,其和是一个给定的目标数字。假设数组中只存在一个符合要求的数值对,返回这些数值的下标
来源:互联网 发布:发现者行车记录仪淘宝 编辑:程序博客网 时间:2024/05/20 20:55
【解题分析】对于数组中某个下标i,如何判断它是否属于符合条件的两个数字之一?最直观的就是再次扫描数字,判断target-array【i】是否存在于数组中。这样做时间复杂度O(n^2),效率不高,原因是没有保存之前的处理结果,每次都在做重复的工作。尽管效率不高,但通过最直观的方法,发现处理当前节点需要依赖于之前的部分结果,如何保存之前的处理结果?可以使用哈希表。
既然需要回答“target-array【i】是否存在于数组中”,那不妨把值作为键,通过询问哈希表是否含有所需要的键来得到回答。最终根据题目,需要返回下标,把下标作为哈希表的值也非常自然了。
【复杂度分析】:先对数组每个元素进行上述哈希处理,再从头至尾扫描数组,判断对应的另一个数是否存在于数组中,时间复杂度O(n+n)。事实上,利用动态规划思想,仅仅利用已经处理的部分解:哈希表只存储前驱结点的信息。对于当前节点,判断前驱中是否含有对应值。当处理完当前节点,把当前节点加入哈希表,作为已经处理的部分解。这样时间复杂度可以进一步减小为O(n)。
参考代码:
vector<int> addsToTarget(vector<int> &numbers, int target){ unordered_map<int, int> numToIndex; vector<int> vi(2); for(auto it=numbers.begin();it!=numbers.end();it++) { if(numToIndex.count(target-*it)) { vi[0]=numToIndex[target-*it]+1; vi[1]=(int)(it-numbers.begin())+1; return vi; } numToIndex[target-*it]=(int)(it-numbers.begin()); }}
这里使用到一个哈希表numToIndex,它的key是vector中的数字,value是key在vector中的下标。
for循环中使用auto变量it,是遍历vector容器的迭代器,it是指向vector某元素的位置,*it是vector在it位置处的值。
0 0
- 从数组中找出一对元素,其和是一个给定的目标数字。假设数组中只存在一个符合要求的数值对,返回这些数值的下标
- 两数之和二 给定一个整形的数组,找出其中的两个数使其和为某个指定的值,并返回这两个数的下标(数组下标是从0开始)。假设数组元素的值各不相同,则要求时间复杂度O(n),n为数组的长度
- 给定一个数组,找出数组的峰值。返回其下标
- 给定一个数组,元素都是正整数,要求返回这些元素所组成的最大数
- 从一个数据元素无序的整型数组中找出最小的两个数的下标
- 从数组中找出两个元素的和等于指定数值,并输出位置。
- 找出升序数组中元素之和最接近于给定数值的两个数
- 给定一个数组,求数组中所有元素的可能组合(每个元素只出现一次),使其和等于给定数的解决办法
- 给定一个数组,求数组中所有元素的可能组合(每个元素只出现一次),使其和等于给定数的解决办法
- 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。
- 在无重复数字的循环数组中查找给定数返回其下标
- 一个数组中两个数的和为N,找出这两个数字的下标
- 找出一个数组中只出现过一次的元素
- 在给定的数组中找出两个元素和为给定值的所有元素对
- 在给定的数组中找出两个元素和为给定值的所有元素对
- 给定一个整数数组,返回数组中两个元素的和为target的索引
- 算法---从一个数组(或者集合中)找出和为某个值的下标
- java__给定一个数组和一个数(该数不一定在数组中),从数组里删掉这个数字,返回剩下的数组长度。
- hadoop eclipse plugin windows下载集合
- Android Studio的Configuring高级配置----》屌炸了
- 如何解决Android 5.0中出现的警告:Service Intent must be explicit
- 编写自己的代码生成工具二:解析配置文件
- Windows下编译fast rcnn
- 从数组中找出一对元素,其和是一个给定的目标数字。假设数组中只存在一个符合要求的数值对,返回这些数值的下标
- 编写自己的代码生成工具三:代码生成组织者
- xUtils介绍
- JAVAThread 多线程学习
- 当你的网站被疯狂攻击时你能做什么?
- 编写自己的代码生成工具四:数据库信息查询实现
- SHELL笔记之让文本飞(四)
- CentOS 7 下 modutils-2.4.27 编译时遇到的问题
- com.mysql.jdbc.PacketTooBigException: Packet for query is too large (1157 > 1024).