首先我记得是用哈希解决的。但是具体怎么操作呢?
工具思考:哈希表的特性
哈希表是一种特殊的集合,由键值对组成。键不可重复
现在我需要一种映射关系:<数组下标,值>,数组下标是有序的,如果数字插入哈希表时的顺序与数组下标增长顺序一致,有一种哈希表,按插入顺序排序,则<数组下标,值>中的数组下标就可以隐去
不过又要要求排序,又要要求o(1)的查找效率,貌似有些不太行
然后unordered_map.find()
,比对的貌似是键,因此需要映射关系<值,数组下标>
从工具出发,我怎么解决这个问题呢?
比如遍历数组,target=9。第一个值为2,则我就可以在哈希表中寻找9-2=7,7存不存在于哈希表中。不存在则将2插入,存在则输出当前遍历到的数组下标,以及寻找到的数字值所对应的映射键
代码编写:
创建一个按插入顺序排序的哈希表
遍历数组,如果没有找到目标数字,则插入哈希表。在哈希表中目标数字要符合数学公式$Number_{hash}=Number_{target} - Number_{now}$
找到则输出。
伪代码
if(target - nums[i] in hash) return [i, hash(key)];
else put nums[i] into hash;
思考:
为什么哈希可以解决这个问题呢?
利用了哈希表中的“唯一性”解题,而题解也是唯一的,因此值唯一,再加上比对的是值,因此可以建立映射关系<值,数组下标>。
为什么想到用哈希呢?
- 首先题目有“查找需求”,因此选择一个合适的,查找效率高的数据结构就很有必要
- 再分析这个“查找需求”——“需要找到两个数,加起来等于目标数”,数学分析过后target=nums[i]+某个数。
- nums[i]是当前遍历得到的数,而剩下的数要么是未来会遇到,要么是以前就遇到了。未来的我们不可预测,但我们可以充分利用以前的信息。
也许在写算法的时候,我们要时刻记住,之前遍历得到的结果都算作已知,至于能怎么利用,要看题目需求和进行数学分析。
根据这题目需求,我们只要查找以前有没有符合条件的数字即可,因此选择哈希表 - 虽然是有些废话了。用“利用之前遍历得到的信息”思想设计出来的算法,有kmp算法等
我回忆起了动态规划。动态规划貌似是利用状态的变化来决定下一步的动向,因此分析有多少种状态,状态之间会怎么转变,状态转变时应该要做什么至关重要
如果值不止一个,也就是答案不唯一,并且输出所有的可能,还能用哈希表解决吗?
优质回答:我不知道