题意
中文描述
给定一个数组,返回数组中两个数的索引(下标),使得这两个数的和是一个特殊的目标值.
可以假定每组输入都有一个确切的输出,并且一个元素不会使用两次.
题解
算法及复杂度(9ms)
先从算法角度进行思考,本题就是要知道两个数,这两个数的和是一个给定的数。很容易的想法就是对每个数num[i]
,求出rest = target-num[i]
.然后在数组中查找rest
是否存在.不存在就继续进行,存在就直接返回结果.
这样直接总的时间复杂度可能是O(n^2)
,因为我们需要进行n的查询,每次查询时间最坏能达到n的量级.一个很小的trick就是,有一种方法可以使在一个数列中查询一个数是否存在的时间复杂度为O(1)
,那就是使用hash的方法.这样就可以把总的时间复杂度降到O(n)
.
如果这个题目是在ACM中出现,通常会对数组大小有一个限制,常用的做法是把给定的数组hash到一个比较大的数组中,每次查询的时间复杂度是O(1)
,总的时间复杂度是O(n)
(n表示输入的数组的长度).
但是,本题使用的是vector,并且没有长度的限制.算法就在那里,时间复杂度也是给定的.在C++11标准中,在标准STL库添加了unordered_map
,这个是给予hash表的map,区别于STL中的map