两数之和
问题描述:
给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。(假设每种输入只会对应一个答案,但是,数组中同一个元素在答案中不能重复出现)
思路1:
这是最容易想到的一种方法,暴力破解,时间复杂度为O(n^2)。我也只想出了这种方法......
思路2:
额,下面这两张图其实都是使用的是哈希查找的方法解决问题,但是图二较图一的不同在于,图二提前将数组的第一个值和索引存储到了哈希表中,图二的运行时间比图一要多,且内存占用也要多一点。(这是为什么啊!?疑惑疑惑!!!)
先不去计较它们用时的问题,先说一下思路二的解题方法吧。
什么是哈希表?
数组和向量都可以存储对象,但是对象的存储位置是随机的,也就是说对象于其存储位置之间没有什么必然的联系。当查找一个对象时,只能以某种顺序(如顺序查找或二分查找)与各个元素进行比较,当数组或向量中的元素数量很多时,查找的效率会明显的降低。
而哈希表是一种有效的存储方式,是不与其他元素进行比较,一次存取便能得到所需要的记录。这就需要在对象的存储位置和对象的关键属性(设为k)之间建立一个特定的对应关系(设为f),使每一个对象与一个唯一的存储位置所对应。在查找时,只需根据待查对象的关键属性k计算f(k)的值即可。如果此对象在集合中,则必定在存储位置f(k)上,因此不需要与集合中的其他元素进行比较。称这种对应关系f为哈希(hash)方法,按照这种思想建立的表为哈希表。
上面我们简单的认识了一下哈希的定义和特性,可以知道,哈希不像数组,它的特性使它只需一次遍历即可找到相应元素。
所以思路就是:
先遍历数组,将每一个遍历的数组元素的值和它所对应的索引值以键值对的方式存储到Map里。
本题是为了找到两数之和等于目标值,那么就需要将元素值作为唯一的key,将元素索引值作为key对应的value。每当我们遍历一个元素时,只需要让目标值减去该元素值得到一个差值,然后看哈希表里是否有该差值,如果有,那么我们就找到了这两个数,返回该key所对应的value;如果没有,就说明不存在两数之和等于目标值。
结束语:
这种方法真的简单爆了。通过本方法,我认识了一种新的数据结构:哈希表,也知道了它的特性。当我们想知道是否存在某个元素时,我们的第一个思路就可以是利用哈希查找的方法解决问题。